カテゴリ:

DML コマンド - 一般

INSERT (マルチテーブル)

(クエリからの)列値を持つ1つ以上の行をテーブルに挿入することにより、複数のテーブルを更新します。無条件挿入と条件付き挿入の両方をサポートします。

こちらもご参照ください:

INSERT

このトピックの内容:

構文

-- Unconditional multi-table insert
INSERT [ OVERWRITE ] ALL
  intoClause [ ... ]
<subquery>

-- Conditional multi-table insert
INSERT [ OVERWRITE ] { FIRST | ALL }
  { WHEN <condition> THEN intoClause [ ... ] }
  [ ... ]
  [ ELSE intoClause ]
<subquery>

条件:

intoClause ::=
  INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]

必須パラメーター

ALL

無条件のマルチテーブル挿入のみ

各行が INSERT ステートメントのすべての INTO 句を実行することを指定します。

注釈

無条件の複数テーブル挿入で FIRST キーワードが指定されている場合(または ALL キーワードが指定されていない場合)、Snowflakeは構文エラーを返します。

FIRST または ALL

条件付きマルチテーブル挿入のみ

FIRST

各行が、条件が TRUE と評価される最初の WHEN 句のみを実行することを指定します。 WHEN 句が TRUE に評価されない場合、 ELSE 句が存在する場合は実行されます。

ALL

各行がすべての WHEN 句を実行することを指定します。 WHEN 句が TRUE に評価されない場合、 ELSE 句が存在する場合は実行されます。

注釈

  • 条件付きマルチテーブル挿入には、少なくとも1つの WHEN 句が含まれている必要があります。

  • WHEN 句には複数の INTO 句を含めることができ、 INTO 句は同じターゲットテーブルに挿入できます。

  • 常に WHEN 句を実行するには、次を使用します。

    WHEN 1=1 THEN ...

条件

条件付きマルチテーブル挿入のみ

INTO 句で指定された値を挿入するために、 TRUE に評価する必要がある条件を指定します。条件は SELECT リストである可能性があります。

ターゲットテーブル

行を挿入するターゲットテーブルを指定します。同じテーブルが(別々の WHEN 句で)複数回参照される場合があります。

各テーブルに INTO 句を含めることで、複数のテーブルをターゲットにできます。

サブクエリ

ターゲットテーブルに挿入される値のソースを決定する SELECT リストを指定します。

オプションのパラメーター

OVERWRITE

テーブルに対するアクセス制御権限を保持しながら、テーブルに挿入する前にターゲットテーブルを切り捨てることを指定します。

INSERT OVERWRITE を含むステートメントは、現在のトランザクションのスコープ内で処理できます。これにより、次のようなトランザクションをコミットする DDL ステートメントを回避できます。

DROP TABLE t;
CREATE TABLE t AS SELECT * FROM ... ;

デフォルト:値なし(挿入を実行する前にターゲットテーブルが 切り捨てられません

( ターゲット列名 [ , ... ] )

ソースの対応する列の値が挿入されるターゲットテーブルの1つ以上の列を指定します。指定されたターゲット列の数は、ソースで指定された値の数と一致する必要があります。

デフォルト:値なし(ターゲットテーブルの列が すべて 更新されます)

VALUES ( ソース列名 | DEFAULT | NULL [ , ... ] )

ターゲットテーブルの対応する列に挿入する1つ以上の値を指定します。値は次のとおりです。

  • ソース列名:ターゲットテーブルの対応する列に挿入される値を含むソースの列を指定します。

  • DEFAULT:ターゲットテーブルの対応する列にデフォルト値を挿入します。

  • NULLNULL 値を挿入します。

句の各値はコンマで区切る必要があります。また、指定する値の数は、ターゲットテーブルに指定する列の数と一致する必要があります。

デフォルト:値なし(ソースの すべての 列の値は、ターゲットテーブルの対応する列に挿入されます)

使用上の注意

  • INTO 句では、 VALUES 句はオプションです。省略すると、 SELECT リストの値がターゲットテーブルに自然な順序で挿入されます。

  • WHEN 句(条件付きマルチテーブル挿入用)および VALUES 句の式は、エイリアスを介してのみサブクエリを参照できます。エイリアスは次のいずれかである必要があります。

    • SELECT 式に指定された明示的なエイリアス。

    • 式のデフォルトのエイリアス。

    • 位置エイリアス($1、$2など)。

    また、最も外側の SELECT リストにないサブクエリの列と式は、 WHEN 句と VALUES 句で参照できません。詳細については、 (このトピック)をご参照ください。

無条件のマルチテーブル挿入

src テーブルの各行をテーブル t1 および t22回 挿入します。この例では、挿入された行は同一ではありません。 VALUES 句を使用してデータを変化させるため、挿入された各行には異なる値/順序があります。

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;

条件付きマルチテーブル挿入

次の2つの例では、 WHEN 句と ELSE 句を使用して各行を挿入するテーブルを決定し、条件付きマルチテーブル挿入を作成する方法を示します。

これらの例は、 INSERT ALLINSERT FIRST の使用の違いも示しています。

ELSE 句を使用してすべての WHEN 句を実行します。

  • n1 > 100 も条件 n1 > 10 を満たしているため、 ALL キーワードを使用すると t1 に2回挿入されます。

  • n1 <= 10ELSE のケースを満たし、 t2 に挿入される行。

    INSERT ALL
      WHEN n1 > 100 THEN
        INTO t1
      WHEN n1 > 10 THEN
        INTO t1
        INTO t2
      ELSE
        INTO t2
    SELECT n1 from src;
    

テーブルsrcに3行が含まれ、n1の値が1、11、および101である場合、 INSERT ステートメントの後、テーブルt1およびt2以下に示す値を保持します。

t1:

101

101 > 100 、したがって最初の WHEN 句はt1に挿入されます

101

101 > 10 、したがって2番目の WHEN t1に挿入されます

11

11 > 10 、したがって2番目の WHEN 句はt1に挿入されます

n1 = 1 の行は、t1に挿入する WHEN 句を満たさないため、および ELSE 句がt1に挿入しないため、t1に挿入されません。

t2:

101

101 > 10 、2番目の WHEN 句がt2に挿入されます。(行は句 WHEN n1 > 100 の資格もありますが、その句はt2に挿入されません。)

11

11 > 10 、したがって2番目の WHEN 句はt2に挿入されます

1

行は WHEN 句のいずれも満たさなかったため、 ELSE 句によってt2に挿入されます

次の例は、 FIRST 句を除いて、前の例と似ています。

INSERT FIRST
  WHEN n1 > 100 THEN
    INTO t1
  WHEN n1 > 10 THEN
    INTO t1
    INTO t2
  ELSE
    INTO t2
SELECT n1 from src;

テーブルsrcに3行が含まれ、n1の値が1、11、および101である場合、 INSERT ステートメントの後、テーブルt1およびt2以下に示す値を保持します。

t1:

101

101 > 100 、したがって最初の WHEN 句はt1に挿入されます

11

11 > 10 、したがって2番目の WHEN 句はt1に挿入されます

n1 = 1 の行は、t1に挿入する WHEN 句を満たさないため、および ELSE 句がt1に挿入しないため、t1に挿入されません。

ALL を使用した前の例とは異なり、 n1 = 101 の行はt1に1回だけ挿入されます。これは、 最初の WHEN 句が TRUE に評価され、2番目の WHEN 句は無視されます。

t2:

11

11 > 10 、したがって2番目の WHEN 句はt2に挿入されます

1

行は WHEN 句のいずれも満たさなかったため、 ELSE 句によってt2に挿入されます

101が100より大きいため、行 n1 = 101 はt2に挿入されないため、最初の WHEN 句と一致しますが、最初の WHEN 句はt2に挿入しません、および行は最初の WHEN 句にすでに修飾されているため、ステートメントは他の WHEN 句をチェックせず、 ELSE 句を使用しません。

エイリアスと参照を含むマルチテーブル挿入

位置エイリアス($1)、明示的エイリアス(an_alias)、デフォルトエイリアス("10 + 20")を使用して値を挿入します。この例では、値 (1, 50, 30) の単一行をテーブル t1 に挿入します。

INSERT ALL
  INTO t1 VALUES ($1, an_alias, "10 + 20")
SELECT 1, 50 AS an_alias, 10 + 20;

参照するために選択する必要がある列からの値の挿入を示します(テーブル srcb および c):

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

参照できない列(src1.key)からの値の挿入を示します。代わりに、選択してエイリアスを作成する必要があります。

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