Verwenden einer SELECT-Anweisung innerhalb einer WHERE-Klausel

8
%Vor%

Gibt es einen Namen, der eine SELECT-Anweisung innerhalb einer WHERE-Klausel beschreibt? Ist das gut / schlecht?

Wäre das eine bessere Alternative?

%Vor%

Es ist weit weniger elegant, scheint aber schneller zu laufen als meine vorherige Version. Ich mag es nicht, weil es in der GUI nicht sehr deutlich angezeigt wird (und es muss von SQL-Anfängern verstanden werden). Ich könnte es in zwei separate Abfragen aufteilen, aber dann beginnen die Dinge überladen zu werden ...

N.B. Ich brauche mehr als nur Datum und Ergebnis (z. B. Name)

    
jofitz 21.06.2011, 11:09
quelle

7 Antworten

6

Es heißt korrelierte Unterabfrage. Es hat seinen Nutzen.

    
Mladen Prajdic 21.06.2011, 11:11
quelle
7

Es ist überhaupt keine schlechte Übung. Sie werden normalerweise als SUBQUERY , SUBSELECT oder NESTED QUERY bezeichnet.

Es ist eine relativ teure Operation, aber es ist durchaus üblich, dass es im Umgang mit Datenbanken viele Unterabfragen gibt, da dies die einzige Möglichkeit ist, bestimmte Arten von Datenoperationen durchzuführen.

    
Pablo Santa Cruz 21.06.2011 11:10
quelle
3

Es gibt einen viel besseren Weg, um Ihr gewünschtes Ergebnis zu erreichen, indem Sie SQL Server verwenden analytische (oder windowing) Funktionen .

%Vor%

Wenn Sie mehr als nur die Kombination aus Datums- und Höchstpunktzahl benötigen, können Sie Ranglistenfunktionen verwenden, z. B .:

%Vor%

Sie können RANK () anstelle von ROW_NUMBER () , wenn mehrere Datensätze zurückgegeben werden sollen, wenn beide denselben MAX (Score) haben.

    
Winston Smith 21.06.2011 11:21
quelle
2

Das Prinzip der Unterabfragen ist nicht schlecht, aber ich denke nicht, dass Sie es in Ihrem Beispiel verwenden sollten. Wenn ich richtig verstehe, möchten Sie die maximale Punktzahl für jedes Datum erhalten. In diesem Fall sollten Sie eine GROUP BY verwenden.

    
rael_kid 21.06.2011 11:12
quelle
1
  

Dies ist eine korrelierte Unterabfrage.

(Es ist eine "verschachtelte" Abfrage - dies ist jedoch sehr nicht-technische Begriff)

Die innere Abfrage nimmt Werte aus der äußeren Abfrage (WHERE st.Date = ScoresTable.Date) und wird daher für jede Zeile in der äußeren Abfrage einmal ausgewertet.

Es gibt auch eine nicht korrelierte Form, in der die innere Abfrage unabhängig ist, da diese nur einmal ausgeführt wird.

z.B.

%Vor%

Es gibt nichts Falsches an der Verwendung von Unterabfragen, außer dort, wo sie nicht benötigt werden:)

Ihre Anweisung kann als Aggregatfunktion wiederbeschreibbar sein, abhängig davon, welche Spalten Sie in Ihrer SELECT-Anweisung benötigen.

%Vor%     
BonyT 21.06.2011 11:15
quelle
1

In Ihrem Fall-Szenario, warum nicht GROUP BY und HAVING-Klausel anstelle der JOINING-Tabelle zu sich selbst verwenden. Sie können auch andere nützliche Funktionen verwenden. siehe diesen Link

    
dr.Crow 02.03.2016 03:42
quelle
0

Unterabfrage ist der Name.

Manchmal ist es erforderlich, aber gut / schlecht hängt davon ab, wie es angewendet wird.

    
Shamim Hafiz 21.06.2011 11:11
quelle

Tags und Links