문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
|
기술문서:레퍼런스:쿼리:응용:merge_query [2025/02/27 16:39] carlito76 |
기술문서:레퍼런스:쿼리:응용:merge_query [2025/11/27 11:53] (현재) carlito76 |
||
|---|---|---|---|
| 줄 6: | 줄 6: | ||
| ====== Merge Query ====== | ====== Merge Query ====== | ||
| - | ^ 물리명 | + | <note tip> |
| - | | 시퀀스 | seq | 숫자 | PK | | + | 최소 지원 버전은 약간의 차이가 있을 수 있습니다. |
| - | | 제목 | title | 문자 | | | + | </ |
| - | | 내용 | content | 문자 | | | + | |
| + | ===== 테이블 명세 ===== | ||
| + | ^ 물리명 | ||
| + | | 머지 키 | merge_key | 문자형 | | PK | | ||
| + | | 머지 값 | merge_value | 문자형 | 100 | | | ||
| + | |||
| + | ===== SQL 스크립트 ===== | ||
| <sxh sql; gutter: true; title: DDL;> | <sxh sql; gutter: true; title: DDL;> | ||
| - | -- MySQL/ | ||
| - | CREATE TABLE ex_merge ( | ||
| - | seq BIGINT NOT NULL PRIMARY KEY, | ||
| - | title VARCHAR(100) NOT NULL, | ||
| - | content TEXT NOT NULL | ||
| - | ); | ||
| - | |||
| - | -- Oracle/ | ||
| CREATE TABLE ex_merge ( | CREATE TABLE ex_merge ( | ||
| - | seq NUMBER | + | merge_key VARCHAR(100) |
| - | title VARCHAR(100) | + | merge_value |
| - | content CLOB NOT NULL | + | |
| ); | ); | ||
| </ | </ | ||
| 줄 29: | 줄 25: | ||
| ===== MySQL/ | ===== MySQL/ | ||
| <sxh sql; gutter: true;> | <sxh sql; gutter: true;> | ||
| - | -- MySQL 4.1 이상 | + | /* |
| + | MySQL 4.1 이상/MariaDB 5.1 이상 | ||
| + | */ | ||
| -- 조건은 PK, UK 컬럼만 가능 | -- 조건은 PK, UK 컬럼만 가능 | ||
| INSERT INTO ex_merge ( | INSERT INTO ex_merge ( | ||
| - | seq | + | merge_key |
| - | , title | + | , merge_value |
| - | , content | + | |
| ) VALUES ( | ) VALUES ( | ||
| - | 1 | + | '1' |
| - | , ' | + | , ' |
| - | , '내용 | + | |
| ) | ) | ||
| ON DUPLICATE KEY | ON DUPLICATE KEY | ||
| UPDATE | UPDATE | ||
| - | title = '제목 UPDATE' | + | merge_value |
| - | , content = ' | + | |
| ; | ; | ||
| </ | </ | ||
| 줄 49: | 줄 44: | ||
| ===== MSSQL ===== | ===== MSSQL ===== | ||
| <sxh sql; gutter: true;> | <sxh sql; gutter: true;> | ||
| - | -- MSSQL 2008 이상 | + | /* |
| + | MSSQL 2008 이상 | ||
| + | */ | ||
| MERGE INTO ex_merge a | MERGE INTO ex_merge a | ||
| USING (SELECT 1 AS dummy) b | USING (SELECT 1 AS dummy) b | ||
| - | ON a.seq = 1 | + | ON a.merge_key |
| WHEN MATCHED THEN | WHEN MATCHED THEN | ||
| UPDATE SET | UPDATE SET | ||
| - | title = '제목 UPDATE' | + | merge_value |
| - | , content = ' | + | |
| WHEN NOT MATCHED THEN | WHEN NOT MATCHED THEN | ||
| INSERT ( | INSERT ( | ||
| - | seq | + | merge_key |
| - | , title | + | , merge_value |
| - | , content | + | |
| ) VALUES ( | ) VALUES ( | ||
| - | 1 | + | '1' |
| - | , ' | + | , ' |
| - | , '내용 | + | |
| ) | ) | ||
| ; | ; | ||
| 줄 72: | 줄 66: | ||
| ===== Oracle/ | ===== Oracle/ | ||
| <sxh sql; gutter: true;> | <sxh sql; gutter: true;> | ||
| - | -- Oracle 9i 이상 | + | /* |
| + | Oracle 9i 이상/Tibero 6 이상 | ||
| + | */ | ||
| MERGE INTO ex_merge | MERGE INTO ex_merge | ||
| USING DUAL | USING DUAL | ||
| - | ON (seq = 1) | + | ON (merge_key |
| WHEN MATCHED THEN | WHEN MATCHED THEN | ||
| UPDATE SET | UPDATE SET | ||
| - | title = '제목 UPDATE' | + | merge_value |
| - | , content = ' | + | |
| WHEN NOT MATCHED THEN | WHEN NOT MATCHED THEN | ||
| INSERT ( | INSERT ( | ||
| - | seq | + | merge_key |
| - | , title | + | , merge_value |
| - | , content | + | |
| ) VALUES ( | ) VALUES ( | ||
| - | 1 | + | '1' |
| - | , ' | + | , ' |
| - | , '내용 | + | |
| ) | ) | ||
| ; | ; | ||
| 줄 95: | 줄 88: | ||
| ===== PostgreSQL ===== | ===== PostgreSQL ===== | ||
| <sxh sql; gutter: true;> | <sxh sql; gutter: true;> | ||
| - | -- PostgreSQL 9.5 미만 | + | /* |
| + | PostgreSQL 9.1 이상 | ||
| + | */ | ||
| WITH upsert AS ( | WITH upsert AS ( | ||
| - | UPDATE SET | + | UPDATE |
| - | title = '제목 UPDATE' | + | merge_value |
| - | , content = ' | + | |
| WHERE | WHERE | ||
| - | seq = 1 | + | merge_key |
| RETURNING * | RETURNING * | ||
| ) | ) | ||
| INSERT INTO ex_merge ( | INSERT INTO ex_merge ( | ||
| - | seq | + | merge_key |
| - | , title | + | , merge_value |
| - | , content | + | |
| ) | ) | ||
| SELECT | SELECT | ||
| - | 1 | + | '1' |
| - | , ' | + | , ' |
| - | , '내용 | + | |
| WHERE | WHERE | ||
| NOT EXISTS (SELECT * FROM upsert) | NOT EXISTS (SELECT * FROM upsert) | ||
| ; | ; | ||
| - | -- PostgreSQL 9.5 이상 | + | /* |
| + | PostgreSQL 9.5 이상 | ||
| + | */ | ||
| -- 조건은 PK, UK 컬럼만 가능 | -- 조건은 PK, UK 컬럼만 가능 | ||
| INSERT INTO ex_merge ( | INSERT INTO ex_merge ( | ||
| - | seq | + | merge_key |
| - | , title | + | , merge_value |
| - | , content | + | |
| ) VALUES ( | ) VALUES ( | ||
| - | 1 | + | '1' |
| - | , ' | + | , ' |
| - | , '내용 | + | |
| ) | ) | ||
| - | ON CONFLICT (seq) | + | ON CONFLICT (merge_key) |
| DO UPDATE SET | DO UPDATE SET | ||
| - | title = '제목 UPDATE' | + | merge_value |
| - | , content = ' | + | |
| ; | ; | ||
| - | -- PostgreSQL 15 이상 | + | /* |
| + | PostgreSQL 15 이상 | ||
| + | */ | ||
| MERGE INTO ex_merge a | MERGE INTO ex_merge a | ||
| USING (SELECT 1 AS dummy) b | USING (SELECT 1 AS dummy) b | ||
| - | ON a.seq = 1 | + | ON a.merge_key |
| WHEN MATCHED THEN | WHEN MATCHED THEN | ||
| UPDATE SET | UPDATE SET | ||
| - | title = '제목 UPDATE' | + | merge_value |
| - | , content = ' | + | |
| WHEN NOT MATCHED THEN | WHEN NOT MATCHED THEN | ||
| INSERT ( | INSERT ( | ||
| - | seq | + | merge_key |
| - | , title | + | , merge_value |
| - | , content | + | |
| ) VALUES ( | ) VALUES ( | ||
| - | 1 | + | '1' |
| - | , ' | + | , ' |
| - | , '내용 | + | |
| ) | ) | ||
| ; | ; | ||
| </ | </ | ||
| + | |||
| + | {{tag>" | ||