INSERT (マルチテーブル)¶
(クエリからの)列値を持つ1つ以上の行をテーブルに挿入することにより、複数のテーブルを更新します。無条件挿入と条件付き挿入の両方をサポートします。
- こちらもご参照ください:
構文¶
-- 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 ...
condition
条件付きマルチテーブル挿入のみ
INTO
句で指定された値を挿入するために、 TRUE に評価する必要がある条件を指定します。条件は SELECT リストである可能性があります。target_table
行を挿入するターゲットテーブルを指定します。同じテーブルが(別々の
WHEN
句で)複数回参照される場合があります。各テーブルに
INTO
句を含めることで、複数のテーブルをターゲットにできます。subquery
ターゲットテーブルに挿入される値のソースを決定する SELECT リストを指定します。
オプションのパラメーター¶
OVERWRITE
テーブルに対するアクセス制御権限を保持しながら、テーブルに挿入する前にターゲットテーブルを切り捨てることを指定します。
INSERT
OVERWRITE
を含むステートメントは、現在のトランザクションのスコープ内で処理できます。これにより、次のようなトランザクションをコミットする DDL ステートメントを回避できます。DROP TABLE t; CREATE TABLE t AS SELECT * FROM ... ;
デフォルト: 値なし(挿入を実行する前にターゲットテーブルが切り捨てられ ません)
( target_col_name [ , ... ] )
ソースの対応する列の値が挿入されるターゲットテーブルの1つ以上の列を指定します。指定されたターゲット列の数は、ソースで指定された値の数と一致する必要があります。
デフォルト: 値なし(ターゲットテーブルの列が すべて 更新されます)
VALUES ( source_col_name | DEFAULT | NULL [ , ... ] )
ターゲットテーブルの対応する列に挿入する1つ以上の値を指定します。値は次のとおりです。
source_col_name
: ターゲットテーブルの対応する列に挿入される値を含むソースの列を指定します。DEFAULT
: ターゲットテーブルの対応する列にデフォルト値を挿入します。NULL
:NULL
値を挿入します。
句の各値はコンマで区切る必要があります。また、指定する値の数は、ターゲットテーブルに指定する列の数と一致する必要があります。
デフォルト: 値なし(ソースの すべての 列の値は、ターゲットテーブルの対応する列に挿入されます)
使用上の注意¶
INTO
句では、VALUES
句はオプションです。省略すると、 SELECT リストの値がターゲットテーブルに自然な順序で挿入されます。WHEN
句(条件付きマルチテーブル挿入用)およびVALUES
句の式は、エイリアスを介してのみサブクエリを参照できます。エイリアスは次のいずれかである必要があります。SELECT 式に指定された明示的なエイリアス。
式のデフォルトのエイリアス。
位置エイリアス($1、$2など)。
また、最も外側の SELECT リストにないサブクエリの列と式は、
WHEN
句とVALUES
句で参照できません。詳細については、 例 (このトピック内)をご参照ください。subquery
によって生成される各行で、source_col_name
の値は、対応するtarget_col_name
のデータ型との互換性が必要です。このルールは、WHEN
句のcondition
によって除外される行にも適用されます。操作の順序は、source_col_name
の値がデータ型の互換性について評価される前に、WHEN
句のフィルターが適用されることを保証するものではありません。
例¶
無条件のマルチテーブル挿入¶
src
テーブルの各行をテーブル t1
および t2
に 2回 挿入します。この例では、挿入された行は同一ではありません。 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 ALL
と INSERT FIRST
の使用の違いも示しています。
ELSE
句を使用してすべての WHEN
句を実行します。
n1 > 100
も条件n1 > 10
を満たしているため、ALL
キーワードを使用するとt1
に2回挿入されます。n1 <= 10
がELSE
のケースを満たし、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 、したがって最初の |
101 |
101 > 10 、したがって2番目の |
11 |
11 > 10 、したがって2番目の |
n1 = 1
の行がt1に挿入されないのは、t1に挿入する WHEN
句を満たさず、 ELSE
句はt1に挿入しないためです。
t2:
101 |
101 > 10 、したがって2番目の |
11 |
11 > 10 、したがって2番目の |
1 |
行は |
次の例は、 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 、したがって最初の |
11 |
11 > 10 、したがって2番目の |
n1 = 1
の行がt1に挿入されないのは、t1に挿入する WHEN
句を満たさず、 ELSE
句はt1に挿入しないためです。
ALL
を使用した前の例とは異なり、 n1 = 101
の行はt1に1回だけ挿入されます。これは、 最初の WHEN
句が TRUE に評価され、2番目の WHEN
句が無視されるためです。
t2:
11 |
11 > 10 、したがって2番目の |
1 |
行は |
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;
参照するために選択する必要がある列からの値の挿入を示します(テーブル src
の b
および 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;