Ist es möglich zu bestellen, wenn die Daten von vielen stammen, die sie auswählen und zusammenführen? Sowie
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 nach Namen bestellen?
Einige sagten, Sie können so abfragen.
Select id,name,age
From Student
Where age < 15 or name like "%a%"
Order by name
Aber in diesem Fall ignoriere ich diese Lösung einfach.
sql
sql-order-by
union
Guilgamos
quelle
quelle
Antworten:
Einfach schreiben
Die Reihenfolge bis wird auf die gesamte Ergebnismenge angewendet
quelle
quelle
xxx UNION yyy ORDER BY zzz
das Äquivalent von(xxx UNION yyy) ORDER BY zzz
Damit die Sortierung nur auf die erste Anweisung in der UNION angewendet wird, können Sie sie mit UNION ALL in eine Unterauswahl einfügen (beide scheinen in Oracle erforderlich zu sein):
Oder (unter Berücksichtigung des Kommentars von Nicholas Carey) Sie können garantieren, dass das obere SELECT bestellt ist und die Ergebnisse wie folgt über dem unteren SELECT angezeigt werden:
quelle
select
Anweisung, die auf diese Unterauswahl verweist, NICHT an . Gemäß dem SQL-Standard ist die Reihenfolge der Ergebnisse undefiniert, mit Ausnahme einer explizitenorder by
Klausel. Das ersteselect
in Ihrem Beispiel gibt wahrscheinlich die Ergebnisse in der von der Unterauswahl zurückgegebenen Reihenfolge zurück, ist jedoch nicht garantiert. Darüber hinaus garantiert dies nicht die Reihenfolge der Ergebnismenge der gesamtenunion
(gleiche Regel im Standard). Wenn Sie von der Bestellung abhängig sind, werden Sie - irgendwann - gebissen.SELECT
.Die beiden anderen Antworten sind richtig, aber ich fand es erwähnenswert, dass der Ort, an dem ich feststeckte, nicht realisierte, dass Sie eine Reihenfolge nach dem Alias benötigen und sicherstellen müssen, dass der Alias für beide Auswahlen gleich ist ... also
Beachten Sie, dass ich in der ersten Auswahl einfache Anführungszeichen verwende, für die anderen jedoch Backticks.
So erhalten Sie die Sortierung, die Sie benötigen.
quelle
SELECT a, b, c FROM (<insert union query here>) AS x;
Sie das umgehen , indem Sie das Ganze in eine einschließen, wenn Sie wirklich vermeiden möchten, die zusätzliche Spalte zurückzugeben.Order By
wird nach angewendetunion
, fügen Sie einfach eineorder by
Klausel am Ende der Anweisungen hinzu:quelle
Wenn ich möchte, dass die Sorte nur auf eine der UNION angewendet wird, wenn Union all verwendet wird:
quelle
Wie in anderen Antworten angegeben, sollte "Order by" nach LAST Union für beide Datensätze gelten, die durch union verbunden sind.
Ich hatte zwei Datensätze, verwendete aber unterschiedliche Tabellen, aber dieselben Spalten. 'Order by' nachdem LAST Union nicht mehr funktioniert hat. Die Verwendung von ALIAS für die in 'order by' verwendete Spalte hat den Trick getan.
Die Lösung lautet also Alias 'User_Name':
quelle
Kann dies verwenden:
quelle