Verschachtelte select-Anweisung in SQL Server


388

Warum funktioniert das Folgende nicht?

SELECT name FROM (SELECT name FROM agentinformation)

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

SELECT name FROM agentinformation

Erstellt die innere select-Anweisung nicht eine Ergebnismenge, die die äußere SELECT-Anweisung dann abfragt?

Antworten:


673

Sie müssen die Unterabfrage aliasen.

SELECT name FROM (SELECT name FROM agentinformation) a  

oder expliziter sein

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

76
Stellen Sie sicher, dass Ihr Alias ​​auch etwas ausführlich ist! Ich liebe es, wenn ich mit t1, t2, t3, t4, t5, t6 an einer Arbeit arbeite
Doug Chamberlain

2
Wohin würde eine whereKlausel für die äußere Abfrage gehen?
Colonel Panic

3
@ColonelPanic: Die WHERE-Klausel für die äußere Abfrage wird ganz am Ende angeheftet.
Joe Stefanelli

"Richtig, ich bin ein Idiot! Danke, werde einmal erlaubt akzeptieren." Nein, nein. Nur unwissend. Wie wir alle.
Lucio Mollinedo

2
Oracle akzeptiert den ersten selectohne den Alias.
Kjetil S.

49

Die Antwort von Joe Stefanelli ist bereits richtig.

SELECT name FROM (SELECT name FROM agentinformation) as a  

Wir müssen einen Alias ​​für die Unterabfrage erstellen, da eine Abfrage ein Tabellenobjekt benötigt, das wir erhalten, wenn wir einen Alias ​​für die Unterabfrage erstellen. Konzeptionell werden die Ergebnisse der Unterabfrage in die äußere Abfrage eingesetzt. Da wir in der äußeren Abfrage ein Tabellenobjekt benötigen, müssen wir einen Alias ​​für die innere Abfrage erstellen.

Anweisungen, die eine Unterabfrage enthalten, haben normalerweise eine der folgenden Formen:

  • WHERE Ausdruck [NOT] IN (Unterabfrage)
  • WHERE Ausdruck compare_operator [ANY | ALL] (Unterabfrage)
  • WO [NICHT] EXISTIERT (Unterabfrage)

Suchen Sie nach weiteren Unterabfrageregeln und Unterabfragetypen .

Weitere Beispiele für verschachtelte Unterabfragen.

  1. IN / NOT IN - Dieser Operator nimmt die Ausgabe der inneren Abfrage nach Ausführung der inneren Abfrage, die null oder mehr Werte haben kann, und sendet sie an die äußere Abfrage. Die äußere Abfrage ruft dann alle übereinstimmenden [IN-Operator] oder nicht übereinstimmenden [NOT IN-Operator] Zeilen ab.

  2. ANY - [> Der Operator ANY oder ANY nimmt die Liste der von der inneren Abfrage erzeugten Werte und ruft alle Werte ab, die größer als der Mindestwert der Liste sind. Das

Beispiel:> ANY (100.200.300), der Operator ANY ruft alle Werte ab, die größer als 100 sind.

  1. ALL - Der Operator [> ALL oder ALL nimmt die Liste der von der inneren Abfrage erzeugten Werte und ruft alle Werte ab, die größer als das Maximum der Liste sind. Das

Beispiel:> ALL (100.200.300), der ALL-Operator ruft alle Werte ab, die größer als 300 sind.

  1. EXISTS - Das Schlüsselwort EXISTS erzeugt einen booleschen Wert [TRUE / FALSE]. Dieser EXISTS überprüft das Vorhandensein der von der Unterabfrage zurückgegebenen Zeilen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.