

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# MERGE
<a name="r_MERGE"></a>

소스 테이블의 행을 대상 테이블에 조건부로 병합합니다. 기존에 이는 여러 삽입, 업데이트 또는 삭제 문을 개별적으로 사용해야만 달성할 수 있습니다. MERGE를 통해 결합할 수 있는 작업에 대한 자세한 내용은 [UPDATE](https://docs.aws.amazon.com/redshift/latest/dg/r_UPDATE.html), [DELETE](https://docs.aws.amazon.com/redshift/latest/dg/r_DELETE.html) 및 [INSERT](https://docs.aws.amazon.com/redshift/latest/dg/r_INSERT_30.html)를 참조하세요.

## 구문
<a name="r_MERGE-synopsis"></a>

```
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 ]
```

## 파라미터
<a name="r_MERGE-parameters"></a>

 *target\$1table*  
MERGE 문이 병합되는 임시 또는 영구 테이블입니다.

 *source\$1table*  
**target\$1table에 병합할 행을 제공하는 임시 또는 영구 테이블입니다. **source\$1table은 스펙트럼 테이블일 수도 있습니다.

 *별칭*  
*source\$1table*의 임시 대체 이름입니다.  
이 파라미터는 선택 사항입니다. AS로 시작하는 *별칭*도 선택 사항입니다.

 *match\$1condition*  
*source\$1table*의 행이 *target\$1table*의 행과 일치할 수 있는지 여부를 결정하는 데 사용되는 소스 테이블 열과 대상 테이블 열 사이에 동일한 술어를 지정합니다. 조건이 충족되면 MERGE는 해당 행에 대해 *matching\$1clause*를 실행합니다 그렇지 않으면 MERGE는 해당 행에 대해 *not\$1matched\$1clause*를 실행합니다.

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

UPDATE  
 *target\$1table*에서 일치하는 행을 업데이트합니다. 지정한 *col\$1name*의 값만 업데이트됩니다.

DELETE  
 *target\$1table*에서 일치하는 행을 삭제합니다.

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

INSERT  
 **match\$1condition에 따라 **target\$1table의 행과 일치하지 않는 **source\$1table의 **target\$1table 행에 삽입합니다. 임의의 순서대로 대상 *col\$1name*을 나열할 수 있습니다. *col\$1name* 값을 제공하지 않으면 기본 순서는 선언된 순서의 모든 테이블 열입니다.

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

 *\$1 expr*  
*col\$1name*의 새 값을 정의하는 표현식입니다.

 REMOVE DUPLICATES  
MERGE 명령이 단순 모드에서 실행되도록 지정합니다. 단순 모드의 요구 사항은 다음과 같습니다.  
+  *target\$1table*과 *source\$1table*은 열 수와 호환 가능한 열 유형 그리고 열 순서가 같아야 합니다.
+  MERGE 명령에서 WHEN 절과 UPDATE 및 INSERT 절을 생략해야 합니다.
+  MERGE 명령에서 REMOVE DUPLICATES 절을 사용해야 합니다.
단순 모드에서 MERGE는 다음 작업을 수행합니다.  
+  *target\$1table*에서 *source\$1table*과 일치하는 행이 있으면 *source\$1table*의 값과 일치하도록 업데이트됩니다.
+  *source\$1table*에서 *target\$1table*과 일치하지 않는 행은 *target\$1table*에 삽입됩니다.
+  *target\$1table*의 여러 행이 *source\$1table*의 동일한 행과 일치하면 중복된 행이 제거됩니다. Amazon Redshift는 한 행을 유지하고 업데이트합니다. *source\$1table*의 행과 일치하지 않는 중복된 행은 변경되 않습니다.
REMOVE DUPLICATES를 사용하면 WHEN MATCHED와 WHEN NOT MATCHED를 사용하는 것보다 성능이 향상됩니다. *target\$1table*과 *source\$1table*이 호환되고 *target\$1table*에 중복된 행을 보존할 필요가 없는 경우에는 REMOVE DUPLICATES를 사용하는 것이 좋습니다.

## 사용 노트
<a name="r_MERGE_usage_notes"></a>
+ MERGE 문을 실행하려면 *source\$1table* 및 *target\$1table*의 소유자이거나 해당 테이블에 대한 SELECT 권한이 있어야 합니다. 또한 MERGE 문에 포함된 작업에 따라 *target\$1table*에 대한 UPDATE, DELETE 및 INSERT 권한이 있어야 합니다.
+  *target\$1table*은 시스템 테이블, 카탈로그 테이블 또는 외부 테이블일 수 없습니다.
+  *source\$1table* 및 *target\$1table*은 동일한 테이블일 수 없습니다.
+  MERGE 문에는 WITH 절을 사용할 수 없습니다.
+  *target\$1table*의 행은 *source\$1table*의 여러 행과 일치할 수 없습니다.

  다음 예제를 검토하세요.

  ```
  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\$1condition* 및 *expr*은 SUPER 형식 열을 부분적으로 참조할 수 없습니다. 예를 들어 *SUPER 형식 객체가 배열이나 구조체인 경우 *match\$1condition* 또는 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 형식](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html)을 참조하세요.
+ *source\$1table*이 큰 경우 *target\$1table*과 *source\$1table* 모두의 조인 열을 분산 키로 정의하면 성능이 향상될 수 있습니다.
+ REMOVE DUPLICATES 절을 사용하려면 *target\$1table*에 대한 SELECT, INSERT, DELETE 권한이 필요합니다.
+  **source\$1table은 뷰 또는 하위 쿼리일 수 있습니다. 다음은 **source\$1table이 중복 행을 제거하는 하위 쿼리인 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 문의 하위 쿼리의 데이터 소스가 될 수 없습니다. 예를 들어 다음 SQL 명령은 하위 쿼리가 `source` 대신 `target`을 참조하기 때문에 ERROR: Source view/subquery in Merge statement cannot reference target table과 같은 오류를 반환합니다.

  ```
  MERGE INTO target
  USING (SELECT id, name FROM target 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);
  ```

## 예제
<a name="sub-examples-merge"></a>

다음 예에서는 두 개의 테이블을 만든 다음 테이블에서 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\$1table에 일치하는 행이 있는 경우 **target\$1table에서 중복 행을 제거하는 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\$1table*에서 ID 값이 23인 행이 하나뿐입니다. *source\$1table*에 ID 값이 30인 행이 없었기 때문에 ID 값이 30인 두 개의 중복된 행은 *target\$1table*에 그대로 남아 있습니다.

## 다음 사항도 참조하세요.
<a name="r_MERGE-see-also"></a>

 [INSERT](r_INSERT_30.md), [UPDATE](r_UPDATE.md), [DELETE](r_DELETE.md) 