Kategorien:

DML-Befehle – Allgemeines

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:

INSERT

Unter diesem Thema:

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üsselwort ALL nicht angegeben wird), gibt Snowflake einen Syntaxfehler zurück.

FIRST oder ALL

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 keine WHEN-Klausel den Wert TRUE ergibt, wird die ELSE-Klausel, falls vorhanden, ausgeführt.

ALL

Gibt an, dass jede Zeile alle WHEN-Klauseln ausführt. Wenn keine WHEN-Klausel den Wert TRUE ergibt, wird die ELSE-Klausel, falls vorhanden, ausgeführt.

Bemerkung

  • Ein bedingtes Einfügen in mehrere Tabellen muss mindestens eine WHEN-Klausel enthalten.

  • Jede WHEN-Klausel kann mehrere INTO-Klauseln enthalten, und die INTO-Klauseln können in dieselbe Zieltabelle eingefügt werden.

  • Damit eine WHEN-Klausel immer ausgeführt wird, verwenden Sie Folgendes:

    WHEN 1=1 THEN ...

Bedingung

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.

Zieltabelle

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.

Unterabfrage

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 übertragen, 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)

( Name_der_Zielspalte [ , ... ] )

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 ( Name_der_Zielspalte | DEFAULT | NULL [ , ... ] )

Gibt einen oder mehrere Werte an, die in die entsprechenden Spalten der Zieltabelle eingefügt werden sollen. Folgende Werte sind möglich:

  • Name_der_Zielspalte: 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 einen NULL-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 die VALUES-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) und VALUES-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- und VALUES-Klauseln referenziert werden. Weitere Details dazu finden Sie unter Beispiele (unter diesem Thema).

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 Bedingung n1 > 10 erfüllt und die daher zweimal in t1 eingefügt werden, wenn das Schlüsselwort ALL verwendet wird.

  • Zeilen, in denen n1 <= 10 dem ELSE-Fall entspricht und in t2 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 werden Daten mit der ersten WHEN-Klausel in t1 einfügt.

101

101 > 10, damit die zweite WHEN-Klausel Daten auch in t1 einfügt.

11

11 > 10, damit die zweite WHEN-Klausel Daten in t1 einfügt.

Die Zeile mit n1 = 1 wird nicht in t1 eingefügt, weil sie keine WHEN-Klausel erfüllt, die in t1 eingefügt wird, und weil die ELSE-Klausel nicht in t1 eingefügt wird.

t2:

101

101 > 10, damit die zweite WHEN-Klausel Daten in t2 einfügt. (Die Zeile qualifiziert sich auch für die Klausel WHEN n1 > 100; diese Klausel wird jedoch nicht in t2 eingefügt.)

11

11 > 10, damit die zweite WHEN-Klausel Daten in t2 einfügt

1

Die Zeile hat keine der WHEN-Klauseln erfüllt, also wird sie von der ELSE-Klausel in t2 eingefügt.

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 werden Daten mit der ersten WHEN-Klausel in t1 einfügt.

11

11 > 10, damit die zweite WHEN-Klausel Daten in t1 einfügt.

Die Zeile mit n1 = 1 wird nicht in t1 eingefügt, weil sie keine WHEN-Klausel erfüllt, die in t1 eingefügt wird, und weil die ELSE-Klausel nicht in t1 eingefügt wird.

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 in TRUE auswertet und die zweite WHEN-Klausel ignoriert wird.

t2:

11

11 > 10, damit die zweite WHEN-Klausel Daten in t2 einfügt

1

Die Zeile hat keine der WHEN-Klauseln erfüllt, also wird sie von der ELSE-Klausel in t2 eingefügt.

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; in diesem 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;