2011-01-17 7 views
127

Ist es möglich, wenn die Daten in der Reihenfolge von vielen wählen und Union es kommen werden together.Such alsWie mit Vereinigung bestellen, indem

Select id,name,age 
From Student 
Where age < 15 
Union 
Select id,name,age 
From Student 
Where Name like "%a%" 

Wie kann ich diese Abfrage mit Namen bestellen.

Einige sagten, Sie können Abfrage wie folgt aussehen.

Select id,name,age 
From Student 
Where age < 15 or name like "%a%" 
Order by name 

Aber in diesem Fall ignoriere ich einfach diese Lösung.

Vielen Dank im Voraus.

+1

Wenn Sie die gleiche Spalte in Union-Abfrage dann an die haben Beenden Sie die Reihenfolge mit Ihrem Spaltennamen. –

Antwort

61
Select id,name,age 
from 
(
    Select id,name,age 
    From Student 
    Where age < 15 
    Union 
    Select id,name,age 
    From Student 
    Where Name like "%a%" 
) results 
order by name 
+35

Wie bernd_k darauf hingewiesen hat, dürfen die einzelnen SELECTs, aus denen eine UNION besteht, definitionsgemäß keine ORDER BY-Klausel enthalten. Die einzige erlaubte ORDER BY-Klausel befindet sich am Ende der UNION und gilt für die gesamte UNION, wodurch "xxx UNION yyy ORDER BY zzz" das Äquivalent von '(xxx UNION yyy) ORDER BY zzz' –

185

Schreiben Sie einfach

Select id,name,age 
From Student 
Where age < 15 
Union 
Select id,name,age 
From Student 
Where Name like "%a%" 
Order by name 

der Auftrag von

zur vollständigen resultset angewendet wird
+24

Was ist, wenn ich die Sortierung möchte nur auf der obersten der UNION angewendet werden? – marifrahman

+3

@marifrahman siehe meine Antwort http://StackOverflow.com/a/43855496/2340825 –

11

beiden anderen Antworten sind richtig, aber ich dachte, es erwähnenswert, dass der Ort, wo ich stecken geblieben war merkt nicht, dass Sie eine Bestellung nach dem Alias ​​benötigen und stellen Sie sicher, dass der Alias ​​für beide selects identisch ist ... also

Beachten Sie, dass ich einfache Anführungszeichen in der ersten Auswahl, aber Backticks für die anderen verwende.

Das wird Ihnen die Sortierung bringen, die Sie brauchen.

+0

Was ist das Wichtige, das Sie mit der Verwendung von Single-Quote in First Select und Backticks in anderen machen möchten? Idealerweise sollte es konsistent sein. – nanosoft

+0

Die erste Auswahl ist ein Literal; Es ist ein Header wie "NAMES". Die zweite Auswahl ist eine Referenz auf eine Tabelle. Ihre erste Zeile wird also "NAMES" heißen und der Rest der Zeilen werden die tatsächlichen Namen sein, die aus der Tabelle ausgewählt werden.Der Punkt ist, dass Ihre Kopfzeile möglicherweise die gleiche Zeichenfolge wie der Name der Spalte ist, aus der Sie auswählen, und das ist die Lösung für die Verwendung der gewünschten Beschriftung, ohne dass es in Ihrer Union kollidiert. –

7

Order By nach union angewandt wird, so dass nur eine order by Klausel am Ende der Anweisungen hinzufügen:

Select id,name,age 
From Student 
Where age < 15 
Union 
Select id,name,age 
From Student 
Where Name like '%a%' 
Order By name 
8

Wenn ich möchte, dass die Art nur eine der UNION angewandt werden, wenn die Verwendung Union alle:

Select id,name,age 
From Student 
Where age < 15 
Union all 
Select id,name,age 
From 
(
Select id,name,age 
From Student 
Where Name like "%a%" 
Order by name 
) 
10

um die Art gilt nur für die erste Anweisung in der Union zu machen, können Sie es in einer subselect mit UNION setzen können ALLE (beides erscheint in Oracle notwendig sein):

Select id,name,age FROM 
( 
Select id,name,age 
From Student 
Where age < 15 
Order by name 
) 
UNION ALL 
Select id,name,age 
From Student 
Where Name like "%a%" 

Or (Adressierung Nicholas Careys Kommentar) Sie die Top-SELECT bestellt garantieren können und Ergebnisse über dem Boden erscheinen wie folgt SELECT:

Select id,name,age, 1 as rowOrder 
From Student 
Where age < 15 
UNION 
Select id,name,age, 2 as rowOrder 
From Student 
Where Name like "%a%" 
Order by rowOrder, name 
+0

Ja. Das ordnet die Ergebnisse des Subselect an. Das ordnet NICHT die Ergebnisse der Anweisung 'select' an, die auf diesen Subselect verweist. Gemäß dem SQL-Standard ist die Reihenfolge der Ergebnisse nicht definiert, wenn keine explizite 'order by' -Klausel angegeben wird. Das erste 'select' in Ihrem Beispiel _probably_ gibt seine Ergebnisse in der Reihenfolge zurück, die vom subselect zurückgegeben wird, aber es ist nicht garantiert. Ferner garantiert das _ nicht * _ die Reihenfolge der Ergebnismenge der gesamten "Union" (gleiche Regel im Standard). Wenn Sie von der Bestellung abhängig sind, werden Sie schließlich gebissen. –

+0

@Nicholas Carey - als ich anfänglich mit einer UNION getestet wurde, verhält es sich unvorhersehbar, wie Sie beschrieben haben, ich denke, die UNION ALL (zumindest in Oracle) war notwendig, um die obere SELECT über dem Boden zu bestellen. Ich habe jedoch eine Alternative zur Verfügung gestellt, die eine korrekte Reihenfolge garantiert und datenbankunabhängig sein sollte. –