Frage

Wenn ich habe ein paar UNION-Anweisungen als konstruiertes Beispiel:

SELECT * FROM xxx WHERE z = 1
UNION 
SELECT * FROM xxx WHERE z = 2
UNION
SELECT * FROM xxx WHERE z = 3

Was ist das Standard-order by Verhalten?

Die Testdaten Ich sehe mich im Wesentlichen nicht zurück, die Daten in der Reihenfolge, die oben angegeben wird. D. h die Daten bestellt, aber ich wollte wissen, was die Vorrangsregeln auf diesen ist.

Eine andere Sache ist, dass in diesem Fall xxx ein View ist. Die Ansicht schließt sich drei verschiedene Tabellen zusammen, um die Ergebnisse zurück ich will.

War es hilfreich?

Lösung

Es gibt keine Standardreihenfolge.

Ohne Sortierung nach Klausel zurückgegeben die Reihenfolge ist nicht definiert. Das bedeutet, dass SQL Server können sie in beliebiger Reihenfolge bringen es mag.

EDIT: Nach dem, was ich gesehen habe, ohne eine Sortierung nach, dass die Reihenfolge, die Ergebnisse zurückkommen, hängt von dem Abfrage-Plan. Wenn es also ein Index, der es verwendet, kann das Ergebnis in dieser Reihenfolge wieder kommt aber auch hier gibt es keine Garantie.

Andere Tipps

In Bezug auf das Hinzufügen eines ORDER BY-Klausel:

Dies ist wahrscheinlich elementar für die meisten hier, aber ich dachte, dass ich diese hinzufügen. Manchmal wollen Sie nicht die Ergebnisse gemischt, so dass Sie wollen die erste Abfrage ergibt sich dann die zweite und so weiter. Zu tun, dass ich nur hinzufügen, eine Dummy ersten Spalt und um damit. Wegen möglicher Probleme mit dem Vergessen eine Spalte in Gewerkschaften an Alias, verwende ich in der Regel ordinals in der Reihenfolge von Klausel keine Spaltennamen.

Zum Beispiel:

SELECT 1, * FROM xxx WHERE z = 'abc'
UNION ALL
SELECT 2, * FROM xxx WHERE z = 'def'
UNION ALL
SELECT 3, * FROM xxx WHERE z = 'ghi'
ORDER BY 1

Die Dummy-Ordnungs Säule ist auch nützlich für die Zeiten, in denen ich zwei Abfragen ausführen werde und ich weiß nur, man geht keine Ergebnisse zurück. Dann kann ich überprüfen, nur die Ordnungs der zurückgegebenen Ergebnisse. Das spart mir aus mit mehreren Datenbankaufrufe und die meisten leer resultset Prüfung zu tun.

gefunden einfach die tatsächliche Antwort.

Da UNION Duplikate entfernt es macht einen DISTINCT SORT. Dies geschieht vor allem der UNION-Anweisungen verkettet werden (check out den Ausführungsplan).

eine Art zu stoppen, führen Sie eine UNION ALL, und dies wird auch nicht Duplikate entfernen.

Wenn Sie kümmern welcher Reihenfolge die Datensätze zurückgegeben werden, müssen Sie einen Auftrag durch verwenden.

Wenn Sie es weglassen, kann es erscheinen organisiert (auf die Indizes auf Basis der von der Abfrage-Plan ausgewählt), aber die Ergebnisse, die Sie heute sehen, ist vielleicht nicht die Ergebnisse, die Sie erwarten, und es könnte sogar ändern, wenn die gleiche Abfrage morgen ausgeführt wird.

Edit: Einige gute, konkrete Beispiele: (alle Beispiele sind MS SQL Server)

  • Dave Pinal Blog beschreibt, wie zwei sehr ähnliche Abfragen eine andere scheinbare Ordnung zeigen können, da verschiedene Indizes verwendet werden:

    SELECT ContactID FROM Person.Contact
    SELECT *         FROM Person.Contact
    
  • Conor Cunningham zeigt, wie die scheinbare Reihenfolge ändern kann, wenn die Tabelle größer wird (wenn der Abfrageoptimierer einen parallelen Ausführungsplan zu verwenden, entscheidet).

  • Hugo Kornelis beweist, dass die scheinbare Ordnung nicht immer auf Primärschlüssel ist. Hier ist seine Follow-up-Post mit Erklärung.

Eine UNION kann bezüglich trügerisch sein gesetzte Ordnung zu führen, da eine Datenbank manchmal eine Art Methode verwenden, die DISTINCT zu schaffen, die in UNION implizit ist, die es wie die Zeilen aussehen läßt bewusst bestellt - dies gilt nicht, auf UNION ALL, für die es keine implizite verschieden, natürlich.

Es gibt jedoch Algorithmen für die impliziten deutlich, wie Oracle-Hash-Verfahren in 10 g +, für die wird keine Reihenfolge angewandt werden.

Als DJ sagt, verwenden Sie immer eine ORDER BY

Es ist sehr häufig schlecht geschriebenen Code kommen über die Tabellendaten übernimmt in Einsatz zurückgebracht, und 95% der Zeit die Coder mit ihm entkommen und sind nie bewusst, dass dies ein Problem, da auf vielen gängigen Datenbanken (MSSQL , Oracle, MySQL). Es ist natürlich ein kompletter Irrtum und soll immer korrigiert werden, wenn es über gekommen ist, und immer, ohne Ausnahme, verwenden Sie eine Order By-Klausel selbst.

Von meiner praktischen Erfahrung können Sie ändern, um von „UNION“ gegen „UNION ALL“ mit ... d.h wenn Ihre Abfrage ist wie

Select Count(*) from Table A
UNION 
Select Count(*) from Table B

result is
10
26

Sie können, um Flip von "UNION" mit "UNION ALL" zu ersetzen ... dann wird ein Ergebnis führen,

26
10
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top