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;