2009-03-04 5 views
19

¿Cómo puedo estar seguro de que mi conjunto de resultados tendrá a primero y b segundos? Me ayudaría a resolver un problema complicado de pedidos.¿Cómo puedo solicitar entradas en un UNION sin ORDER BY?

Aquí es un ejemplo simplificado de lo que estoy haciendo:

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1; 
+1

@tharkun: me doy cuenta de que no te gusta RichB, pero date cuenta de cómo se ve tu pregunta en la página principal si las dos únicas líneas que ves son código SQL, y no la pregunta. Es por eso que lo editó de la manera en que lo hizo, y francamente, su edición hizo que la pregunta se viera mucho mejor. –

+0

@tharkun: separe su tono "severo" de sus ediciones. Están separados. Él seguro es severo en su lenguaje; pero eso no hace que sus ediciones sean menos válidas. –

+0

Volvió a las ediciones de Rich. No estar de acuerdo con nadie ni con nada que no sea la calidad de la pregunta. –

Respuesta

34
SELECT col 
FROM 
    (
     SELECT a col, 0 ordinal FROM A LIMIT 1 
     UNION ALL 
     SELECT b, 1 FROM B LIMIT 1 
    ) t 
ORDER BY ordinal 
+0

que parece ser la versión pro + de lo que Dana sugiere, ¡gracias! – markus

+0

es eso, si no quiero el ordinal en el conjunto de resultados, ¿no? – markus

+0

y ¿qué está haciendo la "t" solitaria en la línea 7? – markus

1

que sé para Oracle no hay manera de garantizar que saldrá por primera vez sin una orden. El problema es que si lo intentas, puede salir en el orden correcto incluso la mayoría de las veces que lo ejecutas. Pero tan pronto como confíe en la producción, saldrá mal.

2

No, el orden de los resultados en una consulta SQL está controlado solo por la cláusula ORDER BY. Es posible que veas resultados ordenados sin una cláusula ORDER BY en alguna situación, pero es por casualidad (por ejemplo, un efecto secundario del plan de consulta actual del optimizador) y no está garantizado.

¿Cuál es el problema de pedido complicado?

+0

gracias, lo pensé ... el complicado problema de los pedidos, si sigue siendo complicado será el contenido de otra pregunta que vincularía aquí . – markus

20

No creo que el orden esté garantizado, al menos no en todos los DBMS.

Lo que he hecho en el pasado para controlar el orden en los sindicatos es:

(SELECT a, 0 AS Foo FROM A LIMIT 1) 
UNION 
(SELECT b, 1 AS Foo FROM B LIMIT 1) 
ORDER BY Foo 
+0

¡oh, eso es brillante, fácil y brillante! – markus

+0

¿Está seguro de que el pedido no se aplicará solo a la última consulta de la unión? –

+0

@Kjetil: en realidad tiene razón, debe haber corchetes – markus

0

yo habría pensado que no, ya que la base de datos lo más probable es que tenga que hacer un ORDER BY con el fin de la UNIÓN .

UNION ALL podría comportarse de manera diferente, pero YMMV.

+0

UNION ALL simplemente garantiza que se devuelvan todos los registros. Un simple UNION filtra los duplicados. – Dana

-6

La respuesta corta es sí, obtendrá A entonces B.

+0

y cuál es la respuesta larga, dado que todo el mundo ¿otro dice lo opuesto? – markus

+0

La respuesta larga sería que sin una cláusula ORDER BY, obtendrá FIFO en función de la cláusula UNION. Por ejemplo, la Tabla B especificada primero en la UNION sería yeild, B-> A. UNION no implica ningún tipo de comportamiento de clasificación en sí mismo. – Bill

+0

personas parecen no estar de acuerdo con usted, ¿puede probar su reclamo? – markus

4

Su conjunto de resultados con UNION eliminará valores distintos.

no puedo encontrar ninguna prueba en la documentación, pero a partir de 10 años de experiencia puedo decir que hace UNION ALL preservar el orden, al menos en Oracle.

No confíe en esto, sin embargo, si está construyendo una planta nuclear o algo así.

+3

sí, ¡estoy construyendo una planta de energía nuclear! ;) – markus

+0

Esto parece funcionar. Tiene sentido que la unión arruine el orden si está buscando duplicidades, mientras que la unión no lo hará – David

Cuestiones relacionadas