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;