Gibt es einen Grund, warum oder warum sollten Sie eine 'Bestellung von' in einer Unterabfrage durchführen?Ist eine Order by-Klausel in einer Unterabfrage zulässig?
Antwort
Ja: Es sollte nicht gemacht werden, weil es konzeptionell keinen Sinn macht.
Die Unterabfrage wird in einigen äußeren Abfragen verwendet (sonst wäre es sinnlos), und diese äußere Abfrage muss sowieso eine Sortierung durchführen, so dass es keinen Sinn hat, die Unterabfrage anzuordnen.
Dies liegt daran, dass Abfrageergebnisse in SQL in keiner bestimmten Reihenfolge angezeigt werden, es sei denn, Sie verwenden eine explizite ORDER. Auch wenn Sie ORDER in der Unterabfrage verwendet haben, können Sie nicht garantieren, dass dies Auswirkungen auf die Reihenfolge der Ergebnisse der äußeren Abfrage hat. also ist es sinnlos.
Es kann natürlich in einigen spezifischen RDBMS aufgrund seiner Implementierung einen Unterschied machen, aber das wird implementierungsspezifisch sein, und nicht etwas, auf das Sie sich verlassen sollten.
Edit: Natürlich, wenn Sie TOP oder LIMIT in der Unterabfrage verwenden, Sie wird Bedarf zu verwenden. Aber das ist nicht Standard-SQL sowieso ...
Sie sollten es verwenden, wenn die Unterabfrage eine Art von LIMIT
/TOP
verwendet.
SQL Server
wird es nicht zulassen, es sei denn, die Unterabfrage TOP
oder FOR XML
Klausel enthält auch:
-- Fails
WITH q(id) AS
(
SELECT 1
UNION ALL
SELECT 2
)
SELECT *
FROM (
SELECT *
FROM q
ORDER BY
id DESC
) q2
-- Succeeds
WITH q(id) AS
(
SELECT 1
UNION ALL
SELECT 2
)
SELECT *
FROM (
SELECT TOP 1 *
FROM q
ORDER BY
id DESC
) q2
-- Succeeds, but ORDER BY is ignored
WITH q(id) AS
(
SELECT 1
UNION ALL
SELECT 2
)
SELECT *
FROM (
SELECT TOP 100 PERCENT *
FROM q
ORDER BY
id DESC
) q2
Sie es tun können, aber ich würde nicht in der Regel, wenn Sie eine Notwendigkeit haben.
Die Optimierers wird ignorieren (oder einen Fehler melden?)
Siehe „Intermediate materialisation“ für einige Verwendungen.
Abhängig von der Größe der Unterabfrage wirkt sich dies auf die Leistung bis zum Grad der Änderung aus.
Reihenfolge sollte nicht auf eine Unterabfrage obwohl. Sie sollten in der Lage sein, den Abschnitt "Reihenfolge nach" in die äußere Abfrage zu verschieben (die die endgültigen Ergebnisse liefern sollte).
Es ist total legitim. I.e. SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC)
aber Sie werden normalerweise die gleichen Ergebnisse erhalten.
Es sei denn, Sie verwenden oben es nicht sinnvoll ist, da Sie in der äußeren Abfrage sowieso
Nein ORDER BY ist gültig in einer Unterabfrage der Bestellung wird, wenn Sie in einer Untergruppe der Gesamtdaten interessiert sind, damit Sie immer brauchen a TOP
(SQL Server). Es hat keinen Sinn, ein ORDER BY ohne TOP in einer Unterabfrage zu haben, weil die gesamte Reihenfolge der Ergebnisse von der äußeren Abfrage verarbeitet wird.
Sie sollten es nicht verwenden. Gemäß der "Art of SQL" verhindert dies tatsächlich, dass der Optimierer verschiedene Optimierungen durchführt, die er andernfalls durchführen könnte, weil dies die Daten in vorläufiger Weise transformiert.
Intelligentere Leute sagen, dass das nicht der richtige/gültige Weg ist, es zu tun. In meinem Fall SELECT TOP 100 Prozent in Sub-Abfrage löste das Problem.
Prost
Normalerweise? Können Sie einen Fall angeben, bei dem die Ergebnisse abweichen würden? – sleske
Es unterscheidet sich, wenn Sie eine LIMIT-Anweisung zu Ihrem Subselect hinzufügen. Wenn Sie in diesem Fall alle Einträge der Top-5-Autoren nach Namen sehen möchten, würden Sie Ihren Subselect in (SELECT ID FROM Autoren ORDER BY Name DESC LIMIT 5) ändern. – loginx
Wahr. Mit TOP/LIMIT macht es einen Unterschied (und ist notwendig, manchmal sogar erforderlich). Ansonsten macht es keinen Unterschied. – sleske