INSERT(다중 테이블)

(쿼리에서) 열 값이 있는 하나 이상의 행을 테이블에 삽입하여 여러 테이블을 업데이트합니다. 무조건부 삽입과 조건부 삽입을 모두 지원합니다.

참고 항목:

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>
Copy

여기서:

intoClause ::=
  INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]
Copy

필수 매개 변수

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 ... ;
Copy

기본값: 값 없음(삽입을 수행하기 전에 대상 테이블이 잘리지 않음)

( target_col_name [ , ... ] )

원본에 있는 해당 열의 값이 삽입되는 대상 테이블에서 하나 이상의 열을 지정합니다. 지정된 대상 열의 수는 원본에 지정된 값의 수와 일치해야 합니다.

기본값: 값 없음(대상 테이블의 모든 열이 업데이트됨)

VALUES ( source_col_name | DEFAULT | NULL [ , ... ] )

대상 테이블의 해당 열에 삽입할 하나 이상의 값을 지정합니다. 값은 다음과 같을 수 있습니다.

  • source_col_name: 원본에서 대상 테이블의 해당 열에 삽입할 값이 있는 열을 지정합니다.

  • DEFAULT: 대상 테이블에서 해당 열의 기본값을 삽입합니다.

  • NULL: NULL 값을 삽입합니다.

절에서 각각의 값은 쉼표로 구분해야 합니다. 또한, 지정된 값의 수는 대상 테이블에 대해 지정된 열의 수와 일치해야 합니다.

기본값: 값 없음(원본에서 모든 열의 값이 대상 테이블의 해당 열에 삽입됨)

사용법 노트

  • INTO 절에서 VALUES 절은 선택 사항입니다. 이 절을 생략하면 SELECT 목록의 값이 자연스러운 순서대로 대상 테이블에 삽입됩니다.

  • WHEN 절(조건부 다중 테이블 삽입의 경우)과 VALUES 절의 식은 별칭을 통해서만 하위 쿼리를 참조할 수 있습니다. 별칭은 다음 중 하나여야 합니다.

    • SELECT 식에 대해 지정된 명시적 별칭.

    • 식의 기본 별칭.

    • 위치 별칭($1, $2 등).

    또한, 가장 바깥쪽 SELECT 목록에 없는 하위 쿼리의 열과 식은 WHENVALUES 절에서 참조할 수 없습니다. 자세한 내용은 이 항목에 있는 를 참조하십시오.

  • subquery 에 의해 생성된 각 행에서 source_col_name 의 값은 해당 target_col_name 의 데이터 타입과 호환되어야 합니다. 이 규칙은 WHEN 절의 condition 에 따라 필터링되는 행에도 적용됩니다. 작업 순서는 source_col_name 의 값이 데이터 타입 호환성에 대해 평가되기 전에 WHEN 절의 필터가 적용된다는 점을 보장하지 않습니다.

무조건부 다중 테이블 삽입

src 테이블의 각 행을 테이블 t1t2두 번 삽입합니다. 이 예에서 삽입된 행은 똑같지 않으며, 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;
Copy

조건부 다중 테이블 삽입

다음 두 예에서는 WHEN 절과 ELSE 절을 사용하여 조건부 다중 테이블 삽입을 만들어 각 행이 삽입되는 테이블(있는 경우)을 결정하는 방법을 보여줍니다.

이러한 예에서는 INSERT ALLINSERT FIRST 사용의 차이점도 보여줍니다.

ELSE 절이 있는 모든 WHEN 절을 실행합니다.

  • n1 > 100n1 > 10 조건도 충족하고 따라서 ALL 키워드가 사용될 때 t1 에 두 번 삽입되는 행.

  • n1 <= 10ELSE 절을 충족하고 t2 에 삽입되는 행.

    INSERT ALL
      WHEN n1 > 100 THEN
        INTO t1
      WHEN n1 > 10 THEN
        INTO t1
        INTO t2
      ELSE
        INTO t2
    SELECT n1 from src;
    
    Copy

테이블 src에 3개의 행이 있고 여기서 n1이 1, 11, 101의 값을 가질 경우에는 INSERT 문 다음에 테이블 t1과 t2에 아래에 표시된 값이 있게 됩니다.

t1:

101

101 > 100이므로 첫 번째 WHEN 절이 t1에 삽입

101

101 > 10이므로 두 번째 WHEN역시 t1에 삽입

11

11 > 10이므로 두 번째 WHEN 절이 t1에 삽입

n1 = 1 이 있는 행은 t1에 삽입하는 WHEN 절을 충족하지 않고 ELSE 절이 t1에 삽입하지 않으므로 t1에 삽입되지 않습니다.

t2:

101

101 > 10이므로 두 번째 WHEN 절이 t2에 삽입. (행은 또한 WHEN n1 > 100 절에 적합하지만, 그 절이 t2에는 삽입하지 않습니다.)

11

11 > 10이므로 두 번째 WHEN 절이 t2에 삽입

1

행이 어떠한 WHEN 도 충족하지 않았으므로 ELSE 절에 의해 t2에 삽입됨

다음 예는 FIRST 절을 제외하면 이전 예와 유사합니다.

INSERT FIRST
  WHEN n1 > 100 THEN
    INTO t1
  WHEN n1 > 10 THEN
    INTO t1
    INTO t2
  ELSE
    INTO t2
SELECT n1 from src;
Copy

테이블 src에 3개의 행이 있고 여기서 n1이 1, 11, 101의 값을 가질 경우에는 INSERT 문 다음에 테이블 t1과 t2에 아래에 표시된 값이 있게 됩니다.

t1:

101

101 > 100이므로 첫 번째 WHEN 절이 t1에 삽입

11

11 > 10이므로 두 번째 WHEN 절이 t1에 삽입

n1 = 1 이 있는 행은 t1에 삽입하는 WHEN 절을 충족하지 않고 ELSE 절이 t1에 삽입하지 않으므로 t1에 삽입되지 않습니다.

ALL 을 사용한 이전 예와는 달리, 첫 번째 WHEN 절이 TRUE로 평가되어 두 번째 WHEN 절이 무시되므로 n1 = 101 이 있는 행 은 t1에 한 번만 삽입됩니다.

t2:

11

11 > 10이므로 두 번째 WHEN 절이 t2에 삽입

1

행이 어떠한 WHEN 도 충족하지 않았으므로 ELSE 절에 의해 t2에 삽입됨

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;
Copy

참조하려면 선택해야 하는 열의 값(테이블 srcbc)을 삽입하는 방법을 보여줍니다.

-- 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;
Copy

참조할 수 없는 열에서 값을 삽입하는 방법을 보여줍니다(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;
Copy