523 Stimmen

Verschachtelte Select-Anweisung in SQL Server

Warum funktioniert das Folgende nicht?

SELECT name FROM (SELECT name FROM agentinformation)

Ich schätze, dass mein Verständnis von SQL falsch ist, denn ich hätte gedacht, dass dies dasselbe zurückgeben würde wie

SELECT name FROM agentinformation

Erzeugt die innere SELECT-Anweisung nicht eine Ergebnismenge, die dann von der äußeren SELECT-Anweisung abgefragt wird?

877voto

Joe Stefanelli Punkte 128819

Sie müssen die Unterabfrage mit einem Alias versehen.

SELECT name FROM (SELECT name FROM agentinformation) a  

oder um es deutlicher zu sagen

SELECT a.name FROM (SELECT name FROM agentinformation) a

105 Stimmen

Achten Sie darauf, dass Ihr Alias auch etwas ausführlicher ist! Ich liebe es, wenn ich mit t1,t2,t3,t4,t5,t6 an einem Programm arbeiten kann.

5 Stimmen

Wo würde ein where Klausel für die äußere Abfrage verwenden?

3 Stimmen

@ColonelPanic: Die WHERE-Klausel für die äußere Abfrage würde ganz am Ende angehängt werden.

75voto

Somnath Muluk Punkte 51007

El 回答 von Joe Stefanelli ist bereits korrekt.

SELECT name FROM (SELECT name FROM agentinformation) as a  

Wir müssen einen Alias der Unterabfrage erstellen, da eine Abfrage ein Tabellenobjekt benötigt, das wir durch Erstellen eines Alias für die Unterabfrage erhalten. Vom Konzept her werden die Ergebnisse der Subquery in der äußeren Abfrage ersetzt. Da wir ein Tabellenobjekt in der äußeren Abfrage benötigen, müssen wir einen Alias für die innere Abfrage erstellen.

Anweisungen, die eine Unterabfrage enthalten, haben normalerweise eine dieser Formen:

  • WHERE Ausdruck [NOT] IN (Unterabfrage)
  • WHERE Ausdruck comparison_operator [ANY | ALL] (Unterabfrage)
  • WHERE [NOT] EXISTS (Unterabfrage)

Mehr Informationen Subquery-Regeln y Subquery-Typen .

Weitere Beispiele von verschachtelten Unterabfragen.

  1. IN / NOT IN - Dieser Operator nimmt die Ausgabe der inneren Abfrage, nachdem die innere Abfrage ausgeführt wurde, die null oder mehr Werte sein kann, und sendet sie an die äußere Abfrage. Die äußere Abfrage holt dann alle übereinstimmenden [IN-Operator] oder nicht übereinstimmenden [NOT IN-Operator] Zeilen ab.

  2. ANY - [>ANY oder ANY-Operator nimmt die von der inneren Abfrage erzeugte Liste von Werten und holt alle Werte, die größer als der Mindestwert der Liste sind. Die

z.B. >ANY(100,200,300), der Operator ANY holt alle Werte, die größer als 100 sind.

  1. ALL - [>ALL oder ALL-Operator nimmt die von der inneren Abfrage erzeugte Liste von Werten und holt alle Werte, die größer als das Maximum der Liste sind. Die

z.B. >ALL(100,200,300), der Operator ALL holt alle Werte, die größer als 300 sind.

  1. EXISTS - Das Schlüsselwort EXISTS liefert einen booleschen Wert [TRUE/FALSE]. Dieses EXISTS prüft die Existenz der von der Unterabfrage zurückgegebenen Zeilen.

-1voto

MUHINDO Punkte 159

VERSUCHEN SIE DIES

'select *,(SELECT count(id) FROM products WHERE user_id = users.id) as products_count from users ORDER BY products_count DESC, ID DESC LIMIT 200

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X