Kombinieren von UNION ALL und ORDER BY in Firebird
-
21-08-2019 - |
Frage
Dies ist mein erster Versuch, meine eigene Frage zu beantworten, da möglicherweise jemand darauf stößt und es daher hilfreich sein könnte.Mit Firebird möchte ich die Ergebnisse zweier Abfragen mit UNION ALL kombinieren und dann die resultierende Ausgabe nach einer bestimmten Spalte sortieren.Etwas wie:
(select C1, C2, C3 from T1)
union all
(select C1, C2, C3 from T2)
order by C3
Die Klammern stammen aus einer gültigen Syntax für andere Datenbanken und werden benötigt, um sicherzustellen, dass die Argumente für UNION ALL (eine Operation, die für die Arbeit mit Tabellen definiert ist – d. h.ein ungeordnet Satz von Datensätzen) versuchen Sie nicht, einzeln bestellt zu werden.Allerdings konnte ich diese Syntax in Firebird nicht zum Laufen bringen – wie kann das gemacht werden?
Lösung
SELECT C1, C2, C3
FROM (
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
)
order by C3
Andere Tipps
Feldnamen werden nicht gleich sein. Deshalb sollten Sie nicht die Feldnamen in der Reihenfolge verwenden können.
Sie können das Feld Index stattdessen verwenden. Wie in:
(select C1, C2, C3 from T1)
union all
(select C7, C8, C9 from T2)
order by 3
Wie wäre es mit:
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
order by 2
Zumindest in den neueren Firebird-Versionen funktioniert es, wenn Sie nach „Nummer“ sortieren, anstatt einen Alias zu verwenden.
In Firebird 1.5 funktioniert dies für mich
create view V1 (C1, C2, C3) as
select C1, C2, C3 from T1
union all
select C1, C2, C3 from T2
und dann
select C1, C2, C3 from V1 order by C3
Führen Sie die UNION ALL in einer Ansicht (ohne die ORDER BY-Klausel), dann aus der Sicht wählen ORDER BY verwendet wird.
Umzug order by
in eine Abfrage Schwanz hat nicht Effekt Ausgang Datagrid.
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
)