it-swarm.com.de

SQL-Abfrage - Verwenden von Order By in UNION

Wie kann man eine Unionsabfrage programmatisch sortieren, wenn Daten aus zwei Tabellen abgerufen werden? Zum Beispiel,

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY table2.field1

Löst eine Ausnahme aus

Hinweis: Dies wird auf dem MS Access Jet-Datenbankmodul versucht

83

Manchmal müssen Sie den ORDER BY in jedem der Abschnitte haben, die mit UNION kombiniert werden müssen.

In diesem Fall

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2
117
ajgreyling
SELECT field1 FROM table1
UNION
SELECT field1 FROM table2
ORDER BY field1
64
Anne Porosoff

Ich denke, das macht einen guten Job beim Erklären.

Die folgende UNION-Abfrage verwendet eine ORDER BY-Klausel:

select supplier_id, supplier_name
from suppliers
where supplier_id > 2000
UNION
select company_id, company_name
from companies
where company_id > 1000
ORDER BY 2;

Da die Spaltennamen zwischen den beiden "select" -Anweisungen unterschiedlich sind, ist es vorteilhafter, auf die Spalten in der ORDER BY-Klausel über ihre Position in der Ergebnismenge zu verweisen. 

In diesem Beispiel haben wir die Ergebnisse nach supplier_name/company_name in aufsteigender Reihenfolge sortiert, wie durch "ORDER BY 2" gekennzeichnet.

Die supplier_name/company_name-Felder befinden sich in Position # 2 der Ergebnismenge

Genommen von hier: http://www.techonthenet.com/sql/union.php

57
Anson Smith

An einem konkreten Beispiel:

SELECT name FROM Folders ORDER BY name
UNION
SELECT name FROM Files ORDER BY name

Dateien:

name
=============================
RTS.exe
thiny1.etl
thing2.elt
f.txt
tcpdump_trial_license (1).Zip

Ordner:

name
============================
Contacts
Desktop
Downloads
Links
Favorites
My Documents

Gewünschte Ausgabe: (Ergebnisse der ersten Auswahl zuerst, d. H. Ordner zuerst)

Contacts
Desktop
Downloads
Favorites
Links
My Documents
f.txt
RTMS.exe
tcpdump_trial_license (1).Zip
thiny1.etl
thing2.elt

SQL, um die gewünschten Ergebnisse zu erzielen:

SELECT name 
FROM (
    SELECT 1 AS rank, name FROM Folders
    UNION 
    SELECT 2 AS rank, name FROM Files) dt
ORDER BY rank, name
28
Ian Boyd

Hier ist ein Beispiel aus Northwind 2007:

SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;

Die ORDER BY-Klausel muss nur die letzte Anweisung sein, nachdem Sie Ihre Vereinigung abgeschlossen haben. Sie können mehrere Sätze zusammenfassen und nach dem letzten Satz eine ORDER BY-Klausel einfügen.

17
Todd Price
(SELECT table1.field1 FROM table1 
UNION
SELECT table2.field1 FROM table2) ORDER BY field1 

Arbeit? Denken Sie daran, Sets zu denken. Holen Sie sich das gewünschte Set mit einer Union und führen Sie Ihre Operationen darauf aus.

9
Nick
SELECT table1Column1 as col1,table1Column2 as col2
    FROM table1
UNION
(    SELECT table2Column1 as col1, table1Column2 as col2
         FROM table2
)
ORDER BY col1 ASC
5
JohnMcG
SELECT field1
FROM ( SELECT field1 FROM table1
       UNION
       SELECT field1 FROM table2
     ) AS TBL
ORDER BY TBL.field1

(benutze ALIAS)

4
MJ Latifi

Das ist das Dümmste, was ich je gesehen habe, aber es funktioniert und mit Ergebnissen kann man nicht streiten.

SELECT *
FROM (
    SELECT table1.field1 FROM table1 ORDER BY table1.field1
    UNION
    SELECT table2.field1 FROM table2 ORDER BY table2.field1
) derivedTable

Das Innere der abgeleiteten Tabelle wird nicht eigenständig ausgeführt, aber als abgeleitete Tabelle funktioniert sie einwandfrei. Ich habe dies auf SS 2000, SS 2005, SS 2008 R2 und allen drei versucht.

4
tlang

Beim Durchsehen dieses Kommentarbereichs kam ich durch zwei verschiedene Muster, die die Frage beantworteten. Leider funktioniert das zweite Muster für SQL 2012 nicht, daher hier meine "Umgehung".


Auftrag nach auf einer gemeinsamen Spalte

Dies ist der einfachste Fall, dem Sie begegnen können. Wie viele Benutzer bereits erwähnt haben, müssen Sie am Ende der Abfrage lediglich einen Order By hinzufügen

SELECT a FROM table1
UNION
SELECT a FROM table2
ORDER BY field1

oder

SELECT a FROM table1 ORDER BY field1
UNION
SELECT a FROM table2 ORDER BY field1

Reihenfolge nach auf verschiedenen Spalten

Hier wird es wirklich schwierig. Mit SQL 2012 habe ich den ersten Beitrag ausprobiert und es funktioniert nicht.

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

Nach der Empfehlung im Kommentar habe ich dies versucht

SELECT * FROM 
(
  SELECT TOP 100 PERCENT table1.field1 FROM table1 ORDER BY table1.field1
) DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT TOP 100 PERCENT table2.field1 FROM table2 ORDER BY table2.field1
) DUMMY_ALIAS2

Dieser Code wurde zwar kompiliert, aber DUMMY_ALIAS1 und DUMMY_ALIAS2 setzen den in der Select-Anweisung festgelegten Order By außer Kraft, wodurch dies unbrauchbar wird.

Die einzige Lösung, die mir einfiel, die für mich funktionierte, bestand nicht darin, eine Union zu verwenden, sondern die Abfragen einzeln auszuführen und dann mit ihnen zu arbeiten. Also im Grunde keine Union verwenden, wenn Sie Order By

2
Bubblesphere

So wird es gemacht

select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 1
     order by pointy) A
union all
select * from 
    (select top 100 percent pointx, pointy from point
     where pointtype = 2
     order by pointy desc) B
2
Prayut Parsekar

Durch die separate Verwendung von order erhält jedes Subset die Reihenfolge, jedoch nicht das gesamte Set. Dies ist das, was Sie möchten, wenn Sie zwei Tabellen zusammenführen.

Sie sollten so etwas verwenden, um one order set zu haben:

SELECT TOP (100) PERCENT field1, field2, field3, field4, field5 FROM 
(SELECT table1.field1, table1.field2, table1.field3, table1.field4, table1.field5 FROM table1
UNION ALL 
SELECT table2.field1, table2.field2, table2.field3, table2.field4, table2.field5 FROM  table2) 
AS unitedTables ORDER BY field5 DESC
1
Ernesto Morales

Wenn nötig, um die innere Sortierung beizubehalten:

SELECT 1 as type, field1 FROM table1 
UNION 
SELECT 2 as type, field1 FROM table2 
ORDER BY type, field1
0
user1795683
(SELECT FIELD1 AS NEWFIELD FROM TABLE1 ORDER BY FIELD1)
UNION
(SELECT FIELD2 FROM TABLE2 ORDER BY FIELD2)
UNION
(SELECT FIELD3 FROM TABLE3 ORDER BY FIELD3) ORDER BY NEWFIELD

Versuche dies. Es hat für mich funktioniert. 

0
mandroid

Die zweite Tabelle darf den Tabellennamen nicht in der ORDER BY-Klausel enthalten.

So...

SELECT table1.field1 FROM table1 ORDER BY table1.field1
UNION
SELECT table2.field1 FROM table2 ORDER BY field1

Löst keine Ausnahme aus

0

Für SQL Server 2014/2012/Andere (nicht geprüft):

SELECT * FROM 
(
  SELECT table1.field1 FROM table1 ORDER BY table1.field1
) 
as DUMMY_ALIAS1

UNION ALL

SELECT * FROM
( 
  SELECT table2.field1 FROM table2 ORDER BY table2.field1
) 
as DUMMY_ALIAS2
0
Bimal Das