Wie kann eine Vereinigungsabfrage programmgesteuert sortiert werden, wenn Daten aus zwei Tabellen abgerufen werden? Beispielsweise,
SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1
Wirft eine Ausnahme
Hinweis: Dies wird im MS Access Jet-Datenbankmodul versucht
SELECT TOP 100 PERCENT
, um sieORDER BY
in einerquelle
UNION
lässt das nicht zu. Möglicherweise gibt es ein anderes Konstrukt, um dies zu tun. Möglicherweise nicht. In beiden Fällen entspricht diese Antwort technisch nicht den Anforderungen des Autors.ORDER BY
Teil eines Cursors, währendUNION
Tabellen bearbeitet werden, weshalb deren Code nicht funktionieren kann. Ich kann nicht sehen, wie Sie die Absicht des OP aus absurdem Code ableiten können. Bedenken Sie, dass SQLUNION
Duplikate entfernt: Wenn dies Ihre "geordneten Ergebnissätze" sind,{1, 2, 3} UNION {2, 4, 6}
wäre das Ergebnis{1, 2, 3, 4, 6}
oder{1, 3, 2, 4, 6}
? Wir wissen es nicht, weil die Vereinigung von "geordneten Ergebnissätzen" in Bezug auf SQL undefiniert ist und das OP nicht angegeben hat.Ich denke, das ist eine gute Erklärung.
Das Folgende ist eine UNION-Abfrage, die eine ORDER BY-Klausel verwendet:
Da sich die Spaltennamen zwischen den beiden "select" -Anweisungen unterscheiden, ist es vorteilhafter, die Spalten in der ORDER BY-Klausel anhand ihrer Position in der Ergebnismenge zu referenzieren.
In diesem Beispiel haben wir die Ergebnisse nach
supplier_name
/company_name
in aufsteigender Reihenfolge sortiert , wie durch "ORDER BY 2" angegeben.Die Felder
supplier_name
/company_name
befinden sich in der Ergebnismenge an Position 2.Entnommen von hier: http://www.techonthenet.com/sql/union.php
quelle
Anhand eines konkreten Beispiels:
Dateien:
Ordner:
Gewünschte Ausgabe: (Ergebnisse der ersten Auswahl zuerst, dh Ordner zuerst)
SQL, um die gewünschten Ergebnisse zu erzielen:
quelle
dt
), sonst funktioniert es nicht. Ich war eine Weile verwirrt darüber, da ich dieses Detail zunächst weggelassen hatte und die von SSMS ausgegebene Fehlermeldung nicht besonders hilfreich ist.Hier ist ein Beispiel aus Northwind 2007:
Die ORDER BY-Klausel muss nur die letzte Anweisung sein, nachdem Sie alle Gewerkschaften geschlossen haben. Sie können mehrere Sätze zusammenfassen und dann nach dem letzten Satz eine ORDER BY-Klausel einfügen.
quelle
Arbeit? Denken Sie daran, Sets zu denken. Holen Sie sich das gewünschte Set mithilfe einer Union und führen Sie dann Ihre Operationen daran aus.
quelle
quelle
(benutze ALIAS)
quelle
Dies ist das Dümmste, was ich je gesehen habe, aber es funktioniert, und Sie können nicht mit Ergebnissen streiten.
Das Innere der abgeleiteten Tabelle wird nicht von alleine ausgeführt, aber als abgeleitete Tabelle funktioniert es einwandfrei. Ich habe dies auf SS 2000, SS 2005, SS 2008 R2 und allen drei Arbeiten versucht.
quelle
So wird es gemacht
quelle
Beim Durchsuchen dieses Kommentarbereichs stieß ich auf zwei verschiedene Muster, die die Frage beantworteten. Leider funktioniert das zweite Muster für SQL 2012 nicht. Hier ist meine "Umgehung".
Bestellen Sie nach einer gemeinsamen Spalte
Dies ist der einfachste Fall, dem Sie begegnen können. Wie viele Benutzer bereits betont haben, müssen Sie
Order By
am Ende der Abfrage nur eine hinzufügenoder
Bestellen Sie nach in verschiedenen Spalten
Hier wird es tatsächlich schwierig. Mit SQL 2012 habe ich den Top-Beitrag ausprobiert und er funktioniert nicht.
Nach der Empfehlung im Kommentar habe ich dies versucht
Dieser Code hat zwar kompiliert, aber das
DUMMY_ALIAS1
undDUMMY_ALIAS2
überschreibt dasOrder By
in derSelect
Anweisung festgelegte, was dies unbrauchbar macht.Die einzige Lösung, die mir einfiel und die für mich funktionierte, bestand darin, keine Gewerkschaft zu verwenden und stattdessen die Abfragen einzeln auszuführen und sie dann zu bearbeiten. Verwenden
Union
Sie also im Grunde genommen kein, wenn Sie möchtenOrder By
quelle
Wenn Sie die Reihenfolge separat verwenden, erhält jede Teilmenge die Reihenfolge, jedoch nicht die gesamte Menge. Dies ist das, was Sie möchten, um zwei Tabellen zu vereinen.
Sie sollten so etwas verwenden, um ein bestelltes Set zu haben :
quelle
Die zweite Tabelle kann den Tabellennamen nicht in die
ORDER BY
Klausel aufnehmen.So...
Wirft keine Ausnahme
quelle
Wenn nötig, um die innere Sortierung beizubehalten:
quelle
Versuche dies. Es hat bei mir funktioniert.
quelle
Für SQL Server 2014/2012 / Andere (nicht aktiviert):
quelle