Verwenden von Unterabfragen¶
Eine Unterabfrage ist eine Abfrage in einer anderen Abfrage. Unterabfragen in einer FROM- oder WHERE-Klausel werden verwendet, um Daten bereitzustellen, die zum Begrenzen oder Vergleichen/Auswerten der von der enthaltenden Abfrage zurückgegebenen Daten verwendet werden.
Unter diesem Thema:
Typen von Unterabfragen¶
Skalare vs. nicht skalare Unterabfragen¶
Unterabfragen können auch als skalar oder nicht skalar kategorisiert werden:
Eine skalare Unterabfrage gibt einen einzelnen Wert zurück (eine Spalte einer Zeile). Wenn keine Zeilen für die Rückgabe qualifiziert sind, gibt die Unterabfrage NULL zurück.
Eine nicht skalare Unterabfrage gibt 0, 1 oder mehrere Zeilen zurück, von denen jede 1 oder mehrere Spalten enthalten kann. Wenn bei keiner Spalte ein zurückzugebender Wert vorhanden ist, gibt die Unterabfrage NULL zurück. Wenn keine Zeilen für die Rückgabe qualifiziert sind, gibt die Unterabfrage 0 Zeilen zurück (nicht NULLs).
Von Snowflake unterstützte Typen¶
Snowflake unterstützt derzeit die folgenden Typen von Unterabfragen:
Operatoren für Unterabfragen¶
Unterabfrageoperatoren bearbeiten verschachtelte Abfrageausdrücke. Sie können verwendet werden, um Werte zu berechnen, die folgende Eigenschaften aufweisen:
Skalare Unterabfragen¶
Eine skalare Unterabfrage ist eine Unterabfrage, die höchstens eine Zeile zurückgibt. Eine skalare Unterabfrage kann an einer beliebigen Stelle erscheinen, an der ein Wertausdruck erscheinen kann, einschließlich der SELECT-Liste, der GROUP BY-Klausel oder als Argument einer Funktion in einer WHERE- oder HAVING-Klausel.
Nutzungshinweise¶
Eine skalare Unterabfrage kann nur ein Element in der SELECT-Liste enthalten.
Wenn eine skalare Unterabfrage mehr als eine Zeile zurückgibt, wird ein Laufzeitfehler generiert.
Korrelierte skalare Unterabfragen werden derzeit nur unterstützt, wenn sie statisch festgelegt werden können, um eine Zeile zurückzugeben (z. B. wenn die SELECT-Liste eine Aggregatfunktion ohne GROUP BY enthält).
Unkorrelierte skalare Unterabfragen werden überall dort unterstützt, wo ein Wertausdruck zulässig ist.
Unterabfragen mit einer Korrelation innerhalb von FLATTEN werden derzeit nicht unterstützt.
Die LIMIT / FETCH-Klausel ist nur in unkorrelierten skalaren Unterabfragen zulässig.
Beispiele¶
Dieses Beispiel zeigt eine grundlegende unkorrelierte Unterabfrage in einer WHERE-Klausel:
SELECT employee_id FROM employees WHERE salary = (SELECT max(salary) FROM employees);
Dieses Beispiel zeigt eine unkorrelierte Unterabfrage in einer FROM-Klausel. Diese einfache Unterabfrage erhält lediglich eine Teilmenge der Informationen in der Tabelle international_GDP
. In der Gesamtabfrage werden Jobs in „Hochlohnländern“ aufgelistet, in denen das Jahreseinkommen des Jobs dem Pro-Kopf-GDP in diesem Land entspricht.
SELECT p.name, p.annual_wage, p.country FROM pay AS p INNER JOIN (SELECT name, per_capita_GDP FROM international_GDP WHERE per_capita_GDP >= 10000.0) AS pcg ON pcg.per_capita_GDP = p.annual_wage AND p.country = pcg.name;
Einschränkungen¶
Unterabfragen können zwar eine Vielzahl von SELECT-Anweisungen enthalten, sie haben jedoch die folgenden Einschränkungen:
Einige Klauseln sind in ANY/ALL/NOT EXISTS-Unterabfragen nicht zulässig.
Der einzige Typ von Unterabfrage, der eine LIMIT / FETCH-Klausel zulässt, ist die unkorrelierte skalare Unterabfrage. Und da eine unkorrelierte skalare Unterabfrage nur eine Zeile zurückgibt, hat die LIMIT-Klausel wenig oder keinen praktischen Wert innerhalb einer Unterabfrage.