MERGE - Amazon Redshift

MERGE

소스 테이블의 행을 대상 테이블에 조건부로 병합합니다. 기존에 이는 여러 삽입, 업데이트 또는 삭제 문을 개별적으로 사용해야만 달성할 수 있습니다. MERGE를 통해 결합할 수 있는 작업에 대한 자세한 내용은 UPDATE, DELETEINSERT를 참조하세요.

구문

MERGE INTO target_table USING source_table [ [ AS ] alias ] ON match_condition [ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) | REMOVE DUPLICATES ]

파라미터

target_table

MERGE 문이 병합되는 임시 또는 영구 테이블입니다.

source_table

target_table에 병합할 행을 제공하는 임시 또는 영구 테이블입니다. source_table은 스펙트럼 테이블일 수도 있습니다.

별칭

source_table의 임시 대체 이름입니다.

이 파라미터는 선택 사항입니다. AS로 시작하는 별칭도 선택 사항입니다.

match_condition

source_table의 행이 target_table의 행과 일치할 수 있는지 여부를 결정하는 데 사용되는 소스 테이블 열과 대상 테이블 열 사이에 동일한 술어를 지정합니다. 조건이 충족되면 MERGE는 해당 행에 대해 matching_clause를 실행합니다 그렇지 않으면 MERGE는 해당 행에 대해 not_matched_clause를 실행합니다.

WHEN MATCHED

소스 행과 대상 행 간의 일치 조건이 참으로 평가될 때 실행할 작업을 지정합니다. UPDATE 조치 또는 DELETE 조치를 지정할 수 있습니다.

UPDATE

target_table에서 일치하는 행을 업데이트합니다. 지정한 col_name의 값만 업데이트됩니다.

DELETE

target_table에서 일치하는 행을 삭제합니다.

WHEN NOT MATCHED

일치 조건이 거짓 또는 알 수 없음으로 평가될 때 실행할 작업을 지정합니다. 이 절에 대한 INSERT 삽입 조치만 지정할 수 있습니다.

INSERT

match_condition에 따라 target_table의 행과 일치하지 않는 source_table의 target_table 행에 삽입합니다. 임의의 순서대로 대상 col_name을 나열할 수 있습니다. col_name 값을 제공하지 않으면 기본 순서는 선언된 순서의 모든 테이블 열입니다.

col_name

수정하려는 하나 이상의 열 이름입니다. 대상 열을 지정할 때 테이블 이름을 포함하지 마세요.

expr

col_name의 새 값을 정의하는 표현식입니다.

REMOVE DUPLICATES

MERGE 명령이 단순 모드에서 실행되도록 지정합니다. 단순 모드의 요구 사항은 다음과 같습니다.

  • target_tablesource_table은 열 수와 호환 가능한 열 유형이 같아야 합니다.

  • MERGE 명령에서 WHEN 절과 UPDATE 및 INSERT 절을 생략해야 합니다.

  • MERGE 명령에서 REMOVE DUPLICATES 절을 사용해야 합니다.

단순 모드에서 MERGE는 다음 작업을 수행합니다.

  • target_table에서 source_table과 일치하는 행이 있으면 source_table의 값과 일치하도록 업데이트됩니다.

  • source_table에서 target_table과 일치하지 않는 행은 target_table에 삽입됩니다.

  • target_table의 여러 행이 source_table의 동일한 행과 일치하면 중복된 행이 제거됩니다. Amazon Redshift는 한 행을 유지하고 업데이트합니다. source_table의 행과 일치하지 않는 중복된 행은 변경되 않습니다.

REMOVE DUPLICATES를 사용하면 WHEN MATCHED와 WHEN NOT MATCHED를 사용하는 것보다 성능이 향상됩니다. target_tablesource_table이 호환되고 target_table에 중복된 행을 보존할 필요가 없는 경우에는 REMOVE DUPLICATES를 사용하는 것이 좋습니다.

사용 노트

  • MERGE 문을 실행하려면 source_tabletarget_table의 소유자이거나 해당 테이블에 대한 SELECT 권한이 있어야 합니다. 또한 MERGE 문에 포함된 작업에 따라 target_table에 대한 UPDATE, DELETE 및 INSERT 권한이 있어야 합니다.

  • target_table은 시스템 테이블, 카탈로그 테이블 또는 외부 테이블일 수 없습니다.

  • source_tabletarget_table은 동일한 테이블일 수 없습니다.

  • MERGE 문에는 WITH 절을 사용할 수 없습니다.

  • target_table의 행은 source_table의 여러 행과 일치할 수 없습니다.

    다음 예제를 검토하십시오.

    CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (1, 'Bob'), (2, 'John'); INSERT INTO source VALUES (1, 'Tony'), (1, 'Alice'), (3, 'Bill'); MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); ERROR: Found multiple matches to update the same tuple. MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); ERROR: Found multiple matches to update the same tuple.

    source 테이블에 ID 값이 1인 행이 여러 개 있기 때문에 두 MERGE 문 모두에서 작업이 실패합니다.

  • match_conditionexpr은 SUPER 형식 열을 부분적으로 참조할 수 없습니다. 예를 들어 SUPER 형식 객체가 배열이나 구조체인 경우 match_condition 또는 expr에 해당 열의 개별 요소를 사용할 수 없지만 전체 열을 사용할 수는 있습니다.

    다음 예제를 검토하십시오.

    CREATE TABLE IF NOT EXISTS target (key INT, value SUPER); CREATE TABLE IF NOT EXISTS source (key INT, value SUPER); INSERT INTO target VALUES (1, JSON_PARSE('{"key": 88}')); INSERT INTO source VALUES (1, ARRAY(1, 'John')), (2, ARRAY(2, 'Bill')); MERGE INTO target USING source ON target.key = source.key WHEN matched THEN UPDATE SET value = source.value[0] WHEN NOT matched THEN INSERT VALUES (source.key, source.value[0]); ERROR: Partial reference of SUPER column is not supported in MERGE statement.

    SUPER 유형형식에 대한 자세한 내용은 SUPER 형식을 참조하세요.

  • source_table이 큰 경우 target_tablesource_table 모두의 조인 열을 분산 키로 정의하면 성능이 향상될 수 있습니다.

  • REMOVE DUPLICATES 절을 사용하려면 target_table에 대한 SELECT, INSERT, DELETE 권한이 필요합니다.

  • source_table은 뷰 또는 하위 쿼리일 수 있습니다. 다음은 source_table이 중복 행을 제거하는 하위 쿼리인 MERGE 문의 예제입니다.

    MERGE INTO target USING (SELECT id, name FROM source GROUP BY 1, 2) as my_source ON target.id = my_source.id WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);

예시

다음 예에서는 두 개의 테이블을 만든 다음 테이블에서 MERGE 작업을 실행하여 대상 테이블에서 일치하는 행을 업데이트하고 일치하지 않는 행을 삽입합니다. 그런 다음 소스 테이블에 다른 값을 삽입하고 다른 MERGE 작업을 실행합니다. 이번에는 일치하는 행을 삭제하고 소스 테이블에서 새 행을 삽입합니다.

먼저 소스 및 대상 테이블을 만들고 채웁니다.

CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (101, 'Bob'), (102, 'John'), (103, 'Susan'); INSERT INTO source VALUES (102, 'Tony'), (103, 'Alice'), (104, 'Bill'); SELECT * FROM target; id | name -----+------------ 101 | Bob 102 | John 103 | Susan (3 rows) SELECT * FROM source; id | name -----+------------ 102 | Tony 103 | Alice 104 | Bill (3 rows)

그런 다음 소스 테이블을 대상 테이블에 병합하여 대상 테이블을 일치하는 행으로 업데이트하고 일치하는 행이 없는 소스 테이블의 행을 삽입합니다.

MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); SELECT * FROM target; id | name -----+------------ 101 | Bob 102 | Tony 103 | Alice 104 | Bill (4 rows)

id 값이 102 및 103인 행은 대상 테이블의 name 값과 일치하도록 업데이트됩니다. 또한 id 값이 104이고 name 값이 Bill인 새 행이 대상 테이블에 삽입됩니다.

그런 다음 소스 테이블에 새 행을 삽입합니다.

INSERT INTO source VALUES (105, 'David'); SELECT * FROM source; id | name -----+------------ 102 | Tony 103 | Alice 104 | Bill 105 | David (4 rows)

마지막으로 대상 테이블에서 일치하는 행을 삭제하고 일치하지 않는 행을 삽입하는 병합 작업을 실행합니다.

MERGE INTO target USING source ON target.id = source.id WHEN MATCHED THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name); SELECT * FROM target; id | name -----+------------ 101 | Bob 105 | David (2 rows)

id 값이 102, 103 및 104인 행이 대상 테이블에서 삭제되고 id 값이 105이고 name 값이 David인 새 행이 대상 테이블에 삽입됩니다.

다음 예제는 REMOVE DUPLICATES 절을 사용하는 MERGE 명령의 단순화된 구문을 보여줍니다.

CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (30, 'Tony'), (11, 'Alice'), (23, 'Bill'); INSERT INTO source VALUES (23, 'David'), (22, 'Clarence'); MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES; SELECT * FROM target; id | name ---+------------ 30 | Tony 11 | Alice 23 | David 22 | Clarence (4 rows)

다음 예제는 REMOVE DUPLICATES 절을 사용하여 source_table에 일치하는 행이 있는 경우 target_table에서 중복 행을 제거하는 MERGE 명령의 단순화된 구문을 보여줍니다.

CREATE TABLE target (id INT, name CHAR(10)); CREATE TABLE source (id INT, name CHAR(10)); INSERT INTO target VALUES (30, 'Tony'), (30, 'Daisy'), (11, 'Alice'), (23, 'Bill'), (23, 'Nikki'); INSERT INTO source VALUES (23, 'David'), (22, 'Clarence'); MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES; SELECT * FROM target; id | name ---+------------ 30 | Tony 30 | Daisy 11 | Alice 23 | David 22 | Clarence (5 rows)

MERGE가 실행된 후에는 target_table에서 ID 값이 23인 행이 하나뿐입니다. source_table에 ID 값이 30인 행이 없었기 때문에 ID 값이 30인 두 개의 중복된 행은 target_table에 그대로 남아 있습니다.

다음 사항도 참조하세요.

INSERT, UPDATE, DELETE