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
절만 실행하도록 지정합니다. TRUE로 평가되는WHEN
절이 없으면ELSE
절(있는 경우)이 실행됩니다.ALL
각 행이 모든
WHEN
절을 실행하도록 지정합니다. TRUE로 평가되는WHEN
절이 없으면ELSE
절(있는 경우)이 실행됩니다.
참고
조건부 다중 테이블 삽입에는 하나 이상의
WHEN
절이 포함되어야 합니다.각
WHEN
절은 여러INTO
절을 포함할 수 있으며,INTO
절은 같은 대상 테이블에 삽입할 수 있습니다.WHEN
절을 항상 실행하려면 다음을 사용하십시오.WHEN 1=1 THEN ...
condition
조건부 다중 테이블 삽입만
INTO
절에 지정된 값이 삽입되도록 TRUE로 평가되어야 하는 조건을 지정합니다. 조건은 SELECT 목록일 수 있습니다.target_table
행을 삽입할 대상 테이블을 지정합니다. (별개의
WHEN
절에서) 같은 테이블을 두 번 이상 참조할 수 있습니다.각 테이블에 대해
INTO
절을 포함하여 여러 테이블을 대상으로 지정할 수 있습니다.subquery
대상 테이블에 삽입할 값의 출처를 결정하는 SELECT 목록을 지정합니다.
선택적 매개 변수¶
OVERWRITE
테이블에 대한 액세스 제어 권한을 유지하면서 대상 테이블을 자른 후에 테이블에 삽입하도록 지정합니다.
OVERWRITE
를 포함한 INSERT 문을 현재 트랜잭션 범위 내에서 처리하면 다음과 같이 트랜잭션을 커밋하는 DDL 문을 방지할 수 있습니다.DROP TABLE t; CREATE TABLE t AS SELECT * FROM ... ;
기본값: 값 없음(삽입을 수행하기 전에 대상 테이블이 잘리지 않음)
( target_col_name [ , ... ] )
원본에 있는 해당 열의 값이 삽입되는 대상 테이블에서 하나 이상의 열을 지정합니다. 지정된 대상 열의 수는 원본에 지정된 값의 수와 일치해야 합니다.
기본값: 값 없음(대상 테이블의 모든 열이 업데이트됨)
VALUES ( source_col_name | DEFAULT | NULL [ , ... ] )
대상 테이블의 해당 열에 삽입할 하나 이상의 값을 지정합니다. 값은 다음과 같을 수 있습니다.
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
에 두 번 삽입합니다. 이 예에서 삽입된 행은 똑같지 않으며, 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;
조건부 다중 테이블 삽입¶
다음 두 예에서는 WHEN
절과 ELSE
절을 사용하여 조건부 다중 테이블 삽입을 만들어 각 행이 삽입되는 테이블(있는 경우)을 결정하는 방법을 보여줍니다.
이러한 예에서는 INSERT ALL
과 INSERT FIRST
사용의 차이점도 보여줍니다.
ELSE
절이 있는 모든 WHEN
절을 실행합니다.
n1 > 100
이n1 > 10
조건도 충족하고 따라서ALL
키워드가 사용될 때t1
에 두 번 삽입되는 행.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이므로 두 번째 |
11 |
11 > 10이므로 두 번째 |
n1 = 1
이 있는 행은 t1에 삽입하는 WHEN
절을 충족하지 않고 ELSE
절이 t1에 삽입하지 않으므로 t1에 삽입되지 않습니다.
t2:
101 |
101 > 10이므로 두 번째 |
11 |
11 > 10이므로 두 번째 |
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이므로 두 번째 |
n1 = 1
이 있는 행은 t1에 삽입하는 WHEN
절을 충족하지 않고 ELSE
절이 t1에 삽입하지 않으므로 t1에 삽입되지 않습니다.
ALL
을 사용한 이전 예와는 달리, 첫 번째 WHEN
절이 TRUE로 평가되어 두 번째 WHEN
절이 무시되므로 n1 = 101
이 있는 행 은 t1에 한 번만 삽입됩니다.
t2:
11 |
11 > 10이므로 두 번째 |
1 |
행이 어떠한 |
101이 100보다 커서 행 n1 = 101
이 t2에 삽입되지 않으므로 첫 번째 WHEN
절과 일치하지만, 첫 번째 WHEN
절은 t2에 삽입하지 않고 해당 문이 다른 WHEN
절을 검사하지 않거나 ELSE
절을 사용하지 않는데, 이는 해당 행이 첫 번째 WHEN
절에 대해 이미 적합하기 때문입니다.
별칭과 참조가 있는 다중 테이블 삽입¶
위치 별칭($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;