2008-12-09 7 views
13

Dies ist mein erster Versuch, meine eigene Frage zu beantworten, da jemand gut darin hineinlaufen könnte und so könnte es hilfreich sein. 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:Kombinieren von UNION ALL und ORDER BY in Firebird

(select C1, C2, C3 from T1) 
union all 
(select C1, C2, C3 from T2) 
order by C3 

Die Klammern kamen gültige Syntax für andere Datenbanken und sind notwendig, um sicherzustellen, dass die Argumente UNION ALL (eine Operation, die auf Tabellen arbeiten definiert ist - also einen ungeordneten Satz von Datensatz) Versuchen Sie nicht, einzeln bestellt zu werden. Allerdings konnte ich diese Syntax nicht in Firebird verwenden - wie kann es gemacht werden?

Antwort

23
SELECT C1, C2, C3 
FROM (
    select C1, C2, C3 from T1 
    union all 
    select C1, C2, C3 from T2 
) 
order by C3 
+0

Vielen Dank ... Ich konnte nicht herausfinden, wie die innere Klausel ohne die Zwischenansicht zu erhalten. – Chris

+0

Beachten Sie, dass diese Abfrage Firebird 2.x oder höher erfordert. – alldayremix

1

Führen Sie UNION ALL in einer Ansicht (ohne die ORDER BY-Klausel) aus, und wählen Sie dann mit ORDER BY aus der Ansicht aus.

+0

+1 für „rückwärts“ Kompatibilität, die anderen Antworten funktionieren nicht in Firebird 1.5 –

12

Feldnamen müssen nicht gleich sein. Aus diesem Grund können Sie den Feldnamen nicht in der Reihenfolge nach verwenden.
Sie können stattdessen den Feldindex verwenden. Wie in:

(select C1, C2, C3 from T1) 
union all 
(select C7, C8, C9 from T2) 
order by 3 
+0

Wie geschrieben, erfordert dies Firebird 2.x, aber wenn Sie die Klammern entfernen funktioniert dies auch in Firebird 1.5 – alldayremix

2

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 
+0

+1 für "rückwärts" Kompatibilität, die anderen Antworten nicht Arbeit in Firebird 1.5 –

+0

@Chris Dies ist die gleiche Antwort wie Chris '. Du solltest deine löschen oder die Antwort von Chris verbessern;) – bluish

4

Wie wäre:

select C1, C2, C3 from T1 
union all 
select C1, C2, C3 from T2 
order by 2 

Mindestens in den neueren Firebird-Versionen Es funktioniert, wenn Sie mit "Nummer" bestellen anstatt zu verwenden ein Alias.

+0

Dies funktioniert auch in Firebird 1.5 – alldayremix

0

Bewegt order by in eine Abfrage Tail hat keine Wirkung, um Datagrid auszugeben.

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 
)