Pregunta

¿Cómo puedo estar seguro de que mi conjunto de resultados tendrá primero a y b ? Me ayudaría a resolver un complicado problema de pedido.

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

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1;
¿Fue útil?

Solución

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

Otros consejos

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

Lo que he hecho en el pasado para controlar el pedido en UNION es:

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

Su conjunto de resultados con UNION eliminará valores distintos.

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

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

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

¿Cuál es el complicado problema de pedido?

Sé que para Oracle no hay forma de garantizar que saldrá primero sin una orden de. 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.

Pensé que no, ya que la base de datos probablemente necesitaría hacer un ORDEN BY para la UNIÓN.

UNION ALL puede comportarse de manera diferente, pero YMMV.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top