Warum bei Beschränkungen in SQL-Unterabfragen

Bei der Bestellung von in Unterabfragen wird ein Fehler ausgetriggers: zB:

set rowcount 10 select * from XXX where Col1 in( select Col2 from YYY order by Col3 desc ) 

Wollte verstehen, warum diese Art von Abfragen in SQL-server eingeschränkt sind? Der Fehler wurde geworfen:

Die ORDER BY-Klausel ist in Sichten, Inline-functionen, abgeleiteten Tabellen, Unterabfragen und gängigen Tabellenausdrücken ungültig, es sei denn, TOP, OFFSET oder FOR XML wird ebenfalls angegeben.

WARUM?

Kurze Antwort:

Weil Sets keine Bestellung haben.

Länger Antwort:

SQL ist eine Implementierung von Relational Calculus, die auf Tupel- Sets (Tables, Rowsets, etc.) basiert. Sets haben keine Bestellung (im Gegensatz zum verwandten Konzept, listn, die Sets mit Bestellung sind).

Darüber hinaus gibt es (allgemein) keinen Nutzen für die Bestellung auf einen Satz vor der endgültigen Ausgabe und eine beträchtliche Menge an Schaden, weil:

  • Der Optimierer kann die Reihenfolge in einem Stadium der Abfrageausführung hinzufügen oder entfernen, wie es für angebracht hält, um die performance der Abfrage zu erhöhen,
  • So wäre es nur (beträchtliche) zusätzliche Arbeit,
  • Und der Optimierer könnte es trotzdem trotzdem den nächsten Schritt rückgängig machen
  • Und Abfragen und Bühnen können parallel durchgeführt werden, da der Optimierer passt, und das ist auch im Konflikt mit der Erhaltung einer Bestellung.
  • Also schon früher angewiesen, bedeutet nicht, dass diese Ordnung noch zu einem späteren timepunkt da sein wird

Der einzige Ort, den es gewöhnlich sinnvoll macht, ist in der endgültigen Ausgabe, da die data sowieso seriell übertragen werden müssen.

Die einzigen Orte, die es vor der endgültigen Ausgabe sinnvoll macht, ist für Dinge wie TOP (N) die eine Bestellung benötigen, um festzustellen, welche Zeilen die "Top" Zeilen sind.

Es kann auch sinnvoll sein für bestimmte Aggregate-functionen, weshalb viele von ihnen ihre eigenen ORDER BY Klauseln haben. Auch für den Aufbau von XML-Ergebnissen in Zwischenstufen.