INSERT (mehrere Tabellen)¶
Aktualisiert mehrere Tabellen, indem eine oder mehrere Zeilen mit Spaltenwerten (aus einer Abfrage) in die Tabellen eingefügt werden. Unterstützt sowohl bedingungsloses als auch bedingtes Einfügen.
- Siehe auch:
Syntax¶
-- Unconditional multi-table insert
INSERT [ OVERWRITE ] ALL
intoClause [ ... ]
<subquery>
-- Conditional multi-table insert
INSERT [ OVERWRITE ] { FIRST | ALL }
{ WHEN <condition> THEN intoClause [ ... ] }
[ ... ]
[ ELSE intoClause ]
<subquery>
Wobei:
intoClause ::= INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]
Erforderliche Parameter¶
ALL
Nur bedingungsloses Einfügen in mehrere Tabellen
Gibt an, dass jede Zeile jede
INTO
-Klausel in der INSERT-Anweisung ausführt.Bemerkung
Wenn das Schlüsselwort
FIRST
bei einem bedingungslosen Einfügen in mehrere Tabellen angegeben wird (oder das SchlüsselwortALL
nicht angegeben wird), gibt Snowflake einen Syntaxfehler zurück.FIRST
oderALL
Nur bedingtes Einfügen in mehrere Tabellen
FIRST
Gibt an, dass jede Zeile nur die erste
WHEN
-Klausel ausführt, für die die Bedingung TRUE ergibt. Wenn keineWHEN
-Klausel den Wert TRUE ergibt, wird dieELSE
-Klausel, falls vorhanden, ausgeführt.ALL
Gibt an, dass jede Zeile alle
WHEN
-Klauseln ausführt. Wenn keineWHEN
-Klausel den Wert TRUE ergibt, wird dieELSE
-Klausel, falls vorhanden, ausgeführt.
Bemerkung
Ein bedingtes Einfügen in mehrere Tabellen muss mindestens eine
WHEN
-Klausel enthalten.Jede
WHEN
-Klausel kann mehrereINTO
-Klauseln enthalten, und dieINTO
-Klauseln können Einfügungen in dieselbe Zieltabelle vornehmen.Damit eine
WHEN
-Klausel immer ausgeführt wird, verwenden Sie Folgendes:WHEN 1=1 THEN ...
condition
Nur bedingtes Einfügen in mehrere Tabellen
Gibt die Bedingung an, die TRUE ergeben muss, damit die in der
INTO
-Klausel angegebenen Werte eingefügt werden können. Die Bedingung kann eine SELECT-Liste sein.target_table
Gibt eine Zieltabelle an, in die Zeilen eingefügt werden sollen. Auf dieselbe Tabelle kann mehr als einmal verwiesen werden (in separaten
WHEN
-Klauseln).Es können mehrere Zieltabellen angegeben werden, indem für jede Tabelle eine
INTO
-Klausel eingefügt wird.subquery
Gibt die SELECT-Liste an, die die Quelle der Werte bestimmt, die in die Zieltabellen eingefügt werden sollen.
Optionale Parameter¶
OVERWRITE
Gibt an, dass die Zieltabellen vor dem Einfügen in die Tabellen gekürzt werden, während die Zugriffssteuerungsrechte an den Tabellen erhalten bleiben.
INSERT-Anweisungen mit
OVERWRITE
können im Rahmen der aktuellen Transaktion verarbeitet werden, wodurch DDL-Anweisungen vermieden werden, die eine Transaktion bestätigen (Commit), wie z. B.:DROP TABLE t; CREATE TABLE t AS SELECT * FROM ... ;
Standard: Kein Wert (die Zieltabellen werden vor dem Einfügen nicht gekürzt)
( target_col_name [ , ... ] )
Gibt eine oder mehrere Spalten in der Zieltabelle an, in die die Werte aus der entsprechenden Spalte der Quelle eingefügt werden. Die Anzahl der angegebenen Zielspalten muss mit der Anzahl der in der Quelle angegebenen Werte übereinstimmen.
Standard: Kein Wert (alle Spalten in der Zieltabelle werden aktualisiert)
VALUES ( source_col_name | DEFAULT | NULL [ , ... ] )
Gibt einen oder mehrere Werte an, die in die entsprechenden Spalten der Zieltabelle eingefügt werden sollen. Folgende Werte sind möglich:
source_col_name
: Gibt die Spalte in der Quelle an, die den Wert enthält, der in die entsprechende Spalte der Zieltabelle eingefügt werden soll.DEFAULT
: Fügt den Standardwert für die entsprechende Spalte in die Zieltabelle ein.NULL
: Fügt einenNULL
-Wert ein.
Jeder Wert in der Klausel muss durch ein Komma getrennt werden. Außerdem muss die Anzahl der angegebenen Werte mit der Anzahl der für die Zieltabelle angegebenen Spalten übereinstimmen.
Standard: Kein Wert (Werte aus allen Spalten der Quelle werden in die entsprechenden Spalten in der Zieltabelle eingefügt)
Nutzungshinweise¶
In einer
INTO
-Klausel ist dieVALUES
-Klausel optional. Wird sie weggelassen, werden die Werte aus der SELECT-Liste in natürlicher Reihenfolge in die Zieltabelle eingefügt.Ausdrücke in
WHEN
-Klauseln (bei bedingtem Einfügen in mehrere Tabellen) undVALUES
-Klauseln können nur über einen Alias auf die Unterabfrage verweisen. Der Alias muss einer der folgenden sein:Expliziter Alias, der für einen SELECT-Ausdruck angegeben wird.
Standard-Alias für einen Ausdruck.
Positionsalias ($1, $2 usw.).
Darüber hinaus können Spalten und Ausdrücke der Unterabfrage, die sich nicht in der äußersten SELECT-Liste befinden, nicht in
WHEN
- undVALUES
-Klauseln referenziert werden. Weitere Details dazu finden Sie unter Beispiele (unter diesem Thema).In jeder von der Unterabfrage
subquery
erzeugten Zeile muss der Wert in der Quellspaltesource_col_name
mit dem Datentyp der entsprechenden Zielspaltetarget_col_name
kompatibel sein. Diese Regel gilt auch für Zeilen, die durch diecondition
-Bedingung in derWHEN
-Klausel herausgefiltert werden würden. Die Reihenfolge der Operationen garantiert nicht, dass der Filter in derWHEN
-Klausel angewendet wird, bevor der Wert in der Quellspalte mit dem Namensource_col_name
auf Datentypkompatibilität ausgewertet wird.
Beispiele¶
Bedingungsloses Einfügen in mehrere Tabellen¶
Fügen Sie jede Zeile der src
Tabelle zweifach in die Tabellen t1
und t2
ein. In diesem Beispiel sind die eingefügten Zeilen nicht identisch: Jede der eingefügten Zeilen hat unterschiedliche Werte/Reihenfolgen, da wir die VALUES-Klausel verwenden, um die Daten zu variieren:
INSERT ALL INTO t1 INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT) INTO t2 (c1, c2, c3) INTO t2 VALUES (n3, n2, n1) SELECT n1, n2, n3 from src; -- If t1 and t2 need to be truncated before inserting, OVERWRITE must be specified INSERT OVERWRITE ALL INTO t1 INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT) INTO t2 (c1, c2, c3) INTO t2 VALUES (n3, n2, n1) SELECT n1, n2, n3 from src;
Bedingtes Einfügen in mehrere Tabellen¶
In den nächsten beiden Beispielen wird erläutert, wie bei einem bedingten Einfügen in mehrere Tabellen vorgegangen wird. Dazu werden WHEN
-Klauseln und eine ELSE
-Klausel verwendet, um zu entscheiden, in welche Tabelle(n) jede Zeile ggf. eingefügt wird.
Diese Beispiele zeigen auch den Unterschied zwischen der Verwendung von INSERT ALL
und INSERT FIRST
.
Alle WHEN
-Klauseln mit einer ELSE
-Klausel ausführen:
Zeilen, in denen
n1 > 100
auch die Bedingungn1 > 10
erfüllt und die daher zweimal int1
eingefügt werden, wenn das SchlüsselwortALL
verwendet wird.Zeilen, in denen
n1 <= 10
demELSE
-Fall entspricht und int2
eingefügt werden.INSERT ALL WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 from src;
Wenn die Tabelle „src“ 3 Zeilen enthält, in denen n1 die Werte 1, 11 und 101 hat, dann enthalten die Tabellen t1 und t2 nach der INSERT-Anweisung die unten aufgeführten Werte:
t1:
101 |
101 > 100, somit führt die erste |
101 |
101 > 10, somit führt die zweite |
11 |
11 > 10, somit führt die zweite |
Die Zeile mit n1 = 1
wird nicht in t1 eingefügt, weil sie keine WHEN
-Klausel für das Einfügen in t1 erfüllt und weil die ELSE
-Klausel nicht zum Einfügen in t1 führt.
t2:
101 |
101 > 10, somit führt die zweite |
11 |
11 > 10, somit führt die zweite |
1 |
Die Zeile erfüllt keine der |
Das nächste Beispiel ist ähnlich wie das vorherige Beispiel, mit Ausnahme einer FIRST
-Klausel.
INSERT FIRST WHEN n1 > 100 THEN INTO t1 WHEN n1 > 10 THEN INTO t1 INTO t2 ELSE INTO t2 SELECT n1 from src;
Wenn die Tabelle „src“ 3 Zeilen enthält, in denen n1 die Werte 1, 11 und 101 hat, dann enthalten die Tabellen t1 und t2 nach der INSERT-Anweisung die unten aufgeführten Werte:
t1:
101 |
101 > 100, somit führt die erste |
11 |
11 > 10, somit führt die zweite |
Die Zeile mit n1 = 1
wird nicht in t1 eingefügt, weil sie keine WHEN
-Klausel für das Einfügen in t1 erfüllt und weil die ELSE
-Klausel nicht zum Einfügen in t1 führt.
Im Gegensatz zum vorherigen Beispiel, in dem ALL
verwendet wurde, wird die Zeile mit n1 = 101
nur einmal in t1 eingefügt, weil die erste WHEN
-Klausel den Wert TRUE ergibt und die zweite WHEN
-Klausel ignoriert wird.
t2:
11 |
11 > 10, somit führt die zweite |
1 |
Die Zeile erfüllt keine der |
Die Zeile n1 = 101
wird nicht in t2 eingefügt, weil 101 größer als 100 ist, also mit der ersten WHEN
-Klausel übereinstimmt, aber die erste WHEN
-Klausel führt nicht zum Einfügen in t2, und die Anweisung überprüft keine der anderen WHEN
-Klauseln oder verwendet die ELSE
-Klausel, da die Zeile bereits für die erste WHEN
-Klausel qualifiziert ist.
Einfügen in mehrere Tabellen mit Aliassen und Referenzen¶
Fügen Sie Werte mit einem Positionsalias ($1
), einem expliziten Alias (an_alias
) und einem Standardalias ("10 + 20"
) ein. Im folgenden Beispiel wird eine einzelne Zeile mit den Werten (1, 50, 30)
in die Tabelle t1
eingefügt.
INSERT ALL INTO t1 VALUES ($1, an_alias, "10 + 20") SELECT 1, 50 AS an_alias, 10 + 20;
Veranschaulichen Sie das Einfügen von Werten aus Spalten, die ausgewählt werden müssen, um referenziert zu werden (b
und c
in der Tabelle src
).
-- Returns error INSERT ALL WHEN c > 10 THEN INTO t1 (col1, col2) VALUES (a, b) SELECT a FROM src; -- Completes successfully INSERT ALL WHEN c > 10 THEN INTO t1 (col1, col2) VALUES (a, b) SELECT a, b, c FROM src;
Veranschaulichen Sie das Einfügen von Werten aus einer Spalte, die nicht referenziert werden kann (src1.key
), stattdessen muss sie ausgewählt und einem Alias zugeordnet werden:
-- Returns error INSERT ALL INTO t1 VALUES (src1.key, a) SELECT src1.a AS a FROM src1, src2 WHERE src1.key = src2.key; -- Completes successfully INSERT ALL INTO t1 VALUES (key, a) SELECT src1.key AS key, src1.a AS a FROM src1, src2 WHERE src1.key = src2.key;