2010-01-20 6 views

Antwort

12

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 ...

11

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 
1

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.

1

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).

-3

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.

+0

Normalerweise? Können Sie einen Fall angeben, bei dem die Ergebnisse abweichen würden? – sleske

+0

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

+0

Wahr. Mit TOP/LIMIT macht es einen Unterschied (und ist notwendig, manchmal sogar erforderlich). Ansonsten macht es keinen Unterschied. – sleske

3

Es sei denn, Sie verwenden oben es nicht sinnvoll ist, da Sie in der äußeren Abfrage sowieso

1

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.

1

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.

2

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

Verwandte Themen