Ich verwende eine Anwendung (MapServer - http://mapserver.org/ ), die SQL-Anweisungen umschließt, sodass sich die ORDER BY-Anweisung in der inneren Abfrage befindet. Z.B
SELECT * FROM (
SELECT ID, GEOM, Name
FROM t
ORDER BY Name
) as tbl
Die Anwendung verfügt über viele verschiedene Datenbanktreiber. Ich verwende hauptsächlich den MS SQL Server-Treiber und SQL Server 2008. Dies löst einen Fehler aus, wenn in einer Unterabfrage ein ORDER BY gefunden wird.
Aus den MS Docs (obwohl dies für SQL Server 2000 gilt, scheint es immer noch zu gelten):
Wenn Sie eine ORDER BY-Klausel in einer Ansicht, einer Inline-Funktion, einer abgeleiteten Tabelle oder einer Unterabfrage verwenden, wird keine geordnete Ausgabe garantiert. Stattdessen wird die ORDER BY-Klausel nur verwendet, um sicherzustellen, dass die vom Top-Operator generierte Ergebnismenge eine konsistente Zusammensetzung aufweist. Die ORDER BY-Klausel garantiert eine geordnete Ergebnismenge nur, wenn sie in der äußersten SELECT-Anweisung angegeben ist.
Der gleiche Abfragetyp, der in Postgres (9) und Oracle ausgeführt wird, gibt jedoch Ergebnisse zurück - mit der in der Unterabfrage definierten Reihenfolge. In Postgres zeigt der Abfrageplan, dass die Ergebnisse sortiert sind, und die Postgres-Versionshinweise enthalten den Artikel, der impliziert, dass Unterabfrageaufträge verwendet werden:
Vermeiden Sie das Sortieren, wenn die Unterabfrage ORDER BY mit der oberen Abfrage übereinstimmt
http://en.wikipedia.org/wiki/Order_by heißt es:
Obwohl einige Datenbanksysteme die Angabe einer ORDER BY-Klausel in Unterauswahlen oder Ansichtsdefinitionen zulassen, hat das Vorhandensein dort keine Auswirkung.
Jedoch aus meiner eigenen Überprüfung von Abfrageplänen:
- SQL Server 2008 unterstützt ORDER BY in einer Unterabfrage nicht
- Postgres 9 unterstützt ORDER BY in einer Unterabfrage
- Oracle 10g unterstützt ORDER BY in einer Unterabfrage
Meine Frage, gibt es also Links, die offiziell bestätigen oder leugnen können, dass Postgres und Oracle das Sortieren in einer Unterabfrage nicht zulassen?
quelle
ORDER BY
in der Unterabfrage als redundant identifizieren und nicht die unnötige Sortierung durchführen.Antworten:
Sie müssen dafür sorgen, dass Ihre Anwendung das Innere nicht
ORDER BY
in die Unterabfrage einfügt (möglicherweise besteht die Möglichkeit, überhaupt keine unnötige Unterabfrage zu verwenden). Wie Sie bereits festgestellt haben, wird diese Syntax in SQL Server ohne nicht unterstütztTOP
. Und mitTOP
, wenn Sie nicht einige Zeilen weglassen möchten, wird durch VerwendenTOP 100 PERCENT
dieORDER BY
optimierten ohnehin weggerendert.Und in Oracle und PostGres, nur weil die Syntax unterstützt , bedeutet nicht , es befolgt wird. Und nur weil Sie beobachten, dass es in einem bestimmten Szenario befolgt wird, bedeutet dies nicht, dass es weiterhin befolgt wird, wenn neue Versionen herauskommen oder wenn Ihre Daten, Statistiken, die Abfrage selbst oder die Umgebung geringfügig geändert werden.
Ich kann Ihnen versichern, dass Sie ohne Zweifel , wenn Sie eine Garantie für die Bestellung wünschen ,
ORDER BY
die äußerste Anfrage stellen müssen. Dies sollte eine Doktrin sein, die Sie unabhängig von der verwendeten Plattform festhalten.Sie fragen nach einem Link, der offiziell angibt, dass etwas nicht unterstützt wird. Dies ist so, als würden Sie in der Bedienungsanleitung Ihres Autos nach einer offiziellen Erklärung suchen, dass Ihr Auto nicht fliegen kann.
quelle
Ich gebe zu, dass dies schwierig ist, aber wenn Sie in einer Notlage sind, versuchen Sie, die oberste Anzahl von Zeilen in der Unterabfrage zurückzugeben. Die Rückgabe der oberen 100 Prozent funktioniert nicht, aber wenn Sie die Probleme lösen möchten, können Sie die Anzahl der Zeilen abfragen und diese als Variable an TOP übergeben. Ich habe dies an einer Datenbank getestet, die auf Kompatibilitätsstufe 80 eingestellt ist, daher denke ich, dass es mit SQL 2000 funktionieren sollte.
quelle
Name
nicht eindeutig ist. Es funktioniert möglicherweise nicht seriell weiter, wenn das Optimierungsprogramm einen anderen Index mit einer anderen Reihenfolge der Schlüsselspalten auswählt.