- Kategorien:
JOIN¶
Bei einer JOIN-Operation werden Zeilen aus zwei Tabellen — oder anderen tabellenartigen Quellen, z. B. Ansichten oder Tabellenfunktionen — kombiniert, um eine neue kombinierte Zeile zu erstellen, die in der Abfrage verwendet werden kann. Eine Erläuterung des JOIN-Konzepts finden Sie unter Verwenden von Verknüpfungen (Joins).
In diesem Thema wird beschrieben, wie man die JOIN-Unterklausel in der FROM-Klausel verwendet. Mit der JOIN-Unterklausel wird explizit oder implizit festgelegt, wie Zeilen in einer Tabelle mit den entsprechenden Zeilen einer anderen Tabelle in Beziehung gesetzt werden sollen. Sie können auch die ASOF JOIN-Unterklausel verwenden, mit der Zeitreihendaten über Zeitstempelspalten verknüpft werden, wenn ihre Werte eng aufeinander folgen, einander vorausgehen oder genau übereinstimmen.
Obwohl zum Verknüpfen von Tabellen die Verwendung von JOIN mit der Unterklausel ON der FROM-Klausel empfohlen wird, können Tabellen alternativ auch mit der WHERE-Klausel verknüpft werden. Weitere Informationen dazu finden Sie in der Dokumentation zur WHERE-Klausel.
Syntax¶
Verwenden Sie eine der folgenden Optionen:
Parameter¶
object_ref1undobject_ref2Jede Objektreferenz ist eine Tabelle oder eine tabellenartige Datenquelle.
JOINVerwenden Sie das Schlüsselwort
JOIN, um anzugeben, dass die Tabellen verknüpft werden sollen. Kombinieren SieJOINmit anderen verknüpfungsbezogenen Schlüsselwörtern (z. B.INNERoderOUTER), um den Typ der Verknüpfung (Join) festzulegen.Die Semantik von Verknüpfungen lautet wie folgt (der Kürze wegen werden unter diesem Thema
o1undo2fürobject_ref1undobject_ref2verwendet):Verknüpfungstyp
Semantik
o1 INNER JOIN o2Bei jeder Zeile von
o1wird für jede Zeile vono2, die die UnterklauselON conditionerfüllt, eine Zeile erzeugt. (Sie können auch ein Komma verwenden, um eine innere Verknüpfung anzugeben. Ein Beispiel dazu finden Sie im Beispielabschnitt). Wenn SieINNER JOINohne dieON-Klausel verwenden (oder wenn Sie ein Komma ohne eineWHERE-Klausel verwenden), ist das Ergebnis dasselbe wie bei Verwendung vonCROSS JOIN: ein kartesisches Produkt (jede Zeile vono1gepaart mit jeder Zeile vono2).o1 LEFT OUTER JOIN o2Das Ergebnis der inneren Verknüpfung wird für jede Zeile von
o1, die keine Übereinstimmungen ino2aufweist, um eine Zeile erweitert. Die Ergebnisspalten, die Bezug aufo2nehmen, enthalten Null.o1 RIGHT OUTER JOIN o2Das Ergebnis der inneren Verknüpfung wird für jede Zeile von
o2, die keine Übereinstimmungen ino1aufweist, um eine Zeile erweitert. Die Ergebnisspalten, die Bezug aufo1nehmen, enthalten Null.o1 FULL OUTER JOIN o2Gibt alle verknüpften Zeilen zurück, plus eine Zeile für jede Zeile ohne Entsprechung auf der linken Seite (rechts erweitert um Nullen), plus eine Zeile für jede Zeile ohne Entsprechung auf der rechten Seite (links erweitert um Nullen).
o1 CROSS JOIN o2Für jede mögliche Kombination von Zeilen aus
o1undo2(d. h. Kartesisches Produkt) enthält die verknüpfte Tabelle eine Zeile, die aus allen Spalten ino1gefolgt von allen Spalten ino2besteht. EinCROSS JOINkann nicht mit einerON condition-Klausel kombiniert werden. Sie können jedoch eineWHERE-Klausel verwenden, um die Ergebnisse zu filtern.o1 NATURAL JOIN o2Ein
NATURAL JOINist identisch mit einem explizitenJOINfür die gemeinsamen Spalten der beiden Tabellen, mit der Ausnahme, dass die gemeinsamen Spalten nur einmal in der Ausgabe enthalten sind. (Bei einer natürlichen Verknüpfung wird davon ausgegangen, dass Spalten mit dem gleichen Namen, die sich jedoch in verschiedenen Tabellen befinden, übereinstimmende Daten enthalten.) Beispiele dazu finden Sie im Beispielabschnitt. EinNATURAL JOINkann mit einemOUTER JOINkombiniert werden. EinNATURAL JOINkann nicht mit einerON condition-Klausel kombiniert werden, da dieJOIN-Bedingung bereits impliziert ist. Sie können jedoch eineWHERE-Klausel verwenden, um die Ergebnisse zu filtern.Das
DIRECTED-Schlüsselwort gibt eine gezielte Verknüpfung an, die die Join-Reihenfolge der Tabellen erzwingt. Die erste oder linke Tabelle wird vor der zweiten oder rechten Tabelle durchsucht. Beispiel:o1 INNER DIRECTED JOIN o2scannt die Tabelleo1vor der Tabelleo2. Gezielte Verknüpfungen sind in den folgenden Situationen nützlich:Sie migrieren Workloads mit Richtlinien für die Verknüpfungsreihenfolge nach Snowflake.
Sie möchten die Leistung verbessern, indem Sie Verknüpfungstabellen in einer bestimmten Reihenfolge scannen.
Standard:
INNER JOINWenn das Wort
JOINohne Angabe vonINNERoderOUTERverwendet wird, dann wirdJOINals innere Verknüpfung interpretiert.Wenn das Schlüsselwort
DIRECTEDhinzugefügt wird, ist der Verknüpfungstyp – zum BeispielINNER,LEFT,RIGHToderFULL– erforderlich.Siehe auch:
ON conditionEin boolescher Ausdruck, der die Zeilen auf beiden Seiten des
JOINdefiniert, die als Übereinstimmung gelten. Beispiel:Bedingungen werden in der Dokumentation zur WHERE-Klausel näher erläutert.
Die
ON-Klausel ist beiCROSS JOINnicht zulässig.Die Klausel
ONist beiNATURAL JOINunnötig und unzulässig; da die Verknüpfungsspalten impliziert sind.Bei anderen Verknüpfungen ist die
ON-Klausel optional. Wenn Sie dieON-Klausel jedoch weglassen, erhalten Sie ein kartesisches Produkt (jede Zeile vonobject_ref1gepaart mit jeder Zeile vonobject_ref2). Ein kartesisches Produkt kann eine sehr große Ausgabe erzeugen, die fast ausschließlich aus Zeilenpaaren besteht, die nicht wirklich miteinander zu tun haben. Dies erfordert viele Ressourcen und ist eine häufige Quelle für Benutzerfehler.USING( column_list )Eine Liste der Spalten, die die beiden Tabellen, die verbunden werden sollen, gemeinsam haben. Diese Spalten werden als Verknüpfungsspalten verwendet. Die Spalten müssen in jeder der zu verbindenden Tabellen denselben Namen und dieselbe Bedeutung haben.
Angenommen, die SQL-Anweisung enthält Folgendes:
In diesem einfachen Fall wäre dies äquivalent zu:
In der Standard-JOIN-Syntax wird für die Projektionsliste (die Liste der Spalten und anderer Ausdrücke nach dem SELECT-Schlüsselwort)
*verwendet. Dies führt dazu, dass die Abfrage genau einmal den Wert vonkey_columnzurückgibt. Die Spalten werden in der folgenden Reihenfolge zurückgegeben:Die Spalten in der
USING-Klausel in der angegebenen Reihenfolge.Die linken Tabellenspalten, die nicht in der
USING-Klausel angegeben sind.Die rechten Tabellenspalten, die nicht in der
USING-Klausel angegeben sind.
Beispiele für standardmäßige und nicht standardmäßige Verwendung finden Sie im Beispielabschnitt.
Nutzungshinweise¶
Die folgenden Einschränkungen gelten für Tabellenfunktionen außer SQL-UDTFs:
Sie können die Klauseln
ON,USINGoderNATURAL JOINnicht in einer lateralen Tabellenfunktion angeben, außer in einer SQL UDTF.Folgende Syntax ist beispielsweise nicht zulässig:
Sie können die Klauseln
ON,USINGoderNATURAL JOINnicht in einem äußeren lateralen Join zu einer Tabellenfunktion angeben, außer in einer SQL UDTF.Folgende Syntax ist beispielsweise nicht zulässig:
Die Verwendung der Syntax führt zu folgendem Fehler:
Diese Einschränkungen gelten nicht, wenn Sie anstelle des JOIN-Schlüsselworts ein Komma verwenden:
Beispiele¶
In vielen der JOIN-Beispiele werden zwei Tabellen genutzt: t1 und t2. Erstellen Sie diese Tabellen und fügen Sie Daten ein:
Die folgenden Beispiele führen Abfragen mit Joins aus:
Führen Sie eine Abfrage mit einer linken äußeren Verknüpfung aus
Führen Sie eine Abfrage mit einer rechten äußeren Verknüpfung aus
Führen Sie eine Abfrage mit einer vollständigen äußeren Verknüpfung aus
Ausführen einer Abfrage, die Verknüpfungen in der FROM-Klausel kombiniert
Ausführen von Abfragen mit Joins, die die USING-Klausel verwenden
Führen Sie eine Abfrage mit einer inneren Verknüpfung aus¶
Im folgenden Beispiel wird eine Abfrage mit einer inneren Verknüpfung ausgeführt:
Führen Sie dieselbe Abfrage mit einer nach innen gerichteten Verknüpfung (Inner-Directed Join) aus, um die Verknüpfungsreihenfolge zu erzwingen, sodass die linke Tabelle zuerst durchsucht wird:
Führen Sie eine Abfrage mit einer linken äußeren Verknüpfung aus¶
Im folgenden Beispiel wird eine Abfrage mit einer linken äußeren Verknüpfung (Left Outer Join) ausgeführt:
In der Ausgabe gibt es einen NULL-Wert für die Zeile in Tabelle t1, für die in Tabelle t2 keine übereinstimmende Zeile vorhanden ist:
Führen Sie eine Abfrage mit einer rechten äußeren Verknüpfung aus¶
Im folgenden Beispiel wird eine Abfrage mit einer rechten äußeren Verknüpfung (Right Outer Join) ausgeführt:
In der Ausgabe gibt es einen NULL-Wert für die Zeile in Tabelle t1, für die in Tabelle t2 keine übereinstimmende Zeile vorhanden ist.
Führen Sie eine Abfrage mit einer vollständigen äußeren Verknüpfung aus¶
Im folgenden Beispiel wird eine Abfrage mit einer vollständigen äußeren Verknüpfung (Full Outer Join) ausgeführt:
Jede Tabelle hat eine Zeile, für die in der anderen Tabelle keine übereinstimmende Zeile vorhanden ist, sodass die Ausgabe zwei Zeilen mit NULL-Werten enthält:
Ausführen einer Abfrage mit einer Kreuzverknüpfung¶
Im folgenden Beispiel wird eine Abfrage mit einer Kreuzverknüpfung (Cross Join) ausgeführt:
Bemerkung
Eine Kreuzverknüpfung hat keine ON-Klausel.
Die Ausgabe zeigt, dass die Abfrage ein kartesisches Produkt erzeugt:
Eine Kreuzverknüpfung kann durch eine WHERE-Klausel gefiltert werden, wie im folgenden Beispiel gezeigt:
Ausführen einer Abfrage mit einer natürlichen Verknüpfung¶
Das folgende Beispiel zeigt eine Abfrage mit einer natürlichen Verknüpfung (Natural Join). Erstellen Sie zunächst zwei Tabellen und fügen Sie Daten ein:
Ausführen einer Abfrage mit einer natürlichen Verknüpfung:
Die Ausgabe zeigt, dass eine natürliche Verknüpfung dieselbe Ausgabe erzeugt wie die entsprechende innere Verknüpfung, außer dass keine zweite Kopie der Join-Spalte enthalten ist:
Das folgende Beispiel zeigt, dass natürliche Verknüpfungen mit äußeren Verknüpfungen kombinierbar sind:
Ausführen einer Abfrage, die Verknüpfungen in der FROM-Klausel kombiniert¶
Sie können in der FROM-Klausel kombinieren. Erstellen Sie eine dritte Tabelle:
Führen Sie eine Abfrage aus, die zwei Joins in der FROM Klausel verkettet:
In einer solchen Abfrage werden die Ergebnisse basierend auf den Verknüpfungen von links nach rechts bestimmt, wobei der Optimierer die Verknüpfungen neu anordnen kann, wenn eine andere Verknüpfungsreihenfolge das gleiche Ergebnis liefert. Wenn die rechte äußere Verknüpfung vor der linken äußeren Verknüpfung erfolgen soll, schreiben Sie die Abfrage wie folgt:
Ausführen von Abfragen mit Joins, die die USING-Klausel verwenden¶
Die nächsten beiden Beispiele zeigen die standardmäßige (ISO 9075) und die nicht standardmäßige Verwendung der USING-Klausel. Beide werden von Snowflake unterstützt.
Dieses erste Beispiel zeigt die übliche Verwendung. Konkret enthält die Projektionsliste genau *:
Obwohl die Beispielabfrage zwei Tabellen verbindet, und jede Tabelle über eine Spalte verfügt, und die Abfrage nach allen Spalten fragt, enthält die Ausgabe nur eine und nicht zwei Spalten:
Das folgende Beispiel zeigt eine nicht standardmäßige Verwendung. Die Projektionsliste enthält etwas anderes als *:
Die Ausgabe enthält zwei Spalten, wobei die zweite Spalte entweder einen Wert aus der zweiten Tabelle oder NULL enthält: