Combinando UNION ALL y ORDER BY en Firebird
-
21-08-2019 - |
Pregunta
Este es mi primer intento de responder a mi propia pregunta, ya que alguien puede encontrarse con esto, por lo que podría ser de ayuda. Usando Firebird, quiero combinar los resultados de dos consultas usando UNION ALL, luego ordenar el resultado resultante en una columna dada. Algo así como:
(select C1, C2, C3 from T1)
union all
(select C1, C2, C3 from T2)
order by C3
Los paréntesis provienen de una sintaxis válida para otras bases de datos, y son necesarios para asegurarse de que los argumentos de UNION ALL (una operación definida para trabajar en tablas, es decir, un conjunto de registros desordenados ) don ' t trate de ser ordenado individualmente. Sin embargo, no pude hacer que esta sintaxis funcione en Firebird, ¿cómo se puede hacer?
Solución
SELECT C1, C2, C3
FROM (
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
)
order by C3
Otros consejos
No se requiere que los nombres de campo sean iguales. Es por eso que no puede usar el nombre del campo en el orden por.
Puede usar el índice de campo en su lugar. Como en:
(select C1, C2, C3 from T1)
union all
(select C7, C8, C9 from T2)
order by 3
¿Qué tal:
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
order by 2
Al menos en las versiones más recientes de Firebird funciona si ordena por " Number " en lugar de usar un alias.
En Firebird 1.5 esto funciona para mí
create view V1 (C1, C2, C3) as
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
y luego
select C1, C2, C3 from V1 order by C3
Realice UNION ALL en una vista (sin la cláusula ORDER BY), luego seleccione de la vista usando ORDER BY.
Mover order by
a una cola de consulta no tiene ningún efecto para generar la cuadrícula de datos.
select * from (
select first 1
C1
from T1
order by id desc
)
union all
select * from (
select first 1
C1
from T2
order by id desc
)