INSERT (マルチテーブル)¶
(クエリからの)列値を持つ1つ以上の行をテーブルに挿入することにより、複数のテーブルを更新します。無条件挿入と条件付き挿入の両方をサポートします。
- こちらもご参照ください。
構文¶
条件:
必須パラメーター¶
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 ステートメントを回避できます。デフォルト: 値なし(挿入を実行する前にターゲットテーブルが切り捨てられ ません)
( 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 句を使用してデータを変化させるため、挿入された各行には異なる値/順序があります。
条件付きの複数テーブル挿入¶
次の2つの例では、 WHEN 句と ELSE 句を使用して各行を挿入するテーブルを決定し、条件付きマルチテーブル挿入を作成する方法を示します。
これらの例は、 INSERT ALL と INSERT FIRST の使用の違いも示しています。
ELSE 句を使用してすべての WHEN 句を実行します。
n1 > 100も条件n1 > 10を満たしているため、ALLキーワードを使用するとt1に2回挿入されます。n1 <= 10がELSEのケースを満たし、t2に挿入される行。
テーブル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 句を除いて、前の例と似ています。
テーブル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 に挿入します。
参照するために選択する必要がある列からの値の挿入を示します(テーブル src の b および c)。
参照できない列(src1.key)からの値の挿入を示します。代わりに、選択してエイリアスを作成する必要があります。