반응형
MERGE는 MERGE INTO 옆에 적힌 테이블에다가
USING 옆에 적힌 테이블 데이터를 부어주는데
매칭(ON 절)이 된 경우 UPDATE 하고
없는 경우 INSERT 한다.
SQLD 30회 42번 문제
실행 결과는 3행이 병합되었다고 뜬다.
1행은 매칭된 A,B,C 중 조건이 맞아서 UPDATE된 'B'
나머지 2행은 매칭안되서 INSERT 된 'D', 'E'
어딘가에서 병합된 3행이 'X', 'D', 'E'라는 설명이 있어서 한참 고민했다.
아래 MERGE 쿼리에서 NOT MATCHED 부분을 빼면 2행이 병합되었다고 뜨는걸 보고 'X'가 아니라 'B'인걸 알았다.
CREATE TABLE SQLD_30_42_01 (
COL1 VARCHAR(45) NOT NULL,
COL2 VARCHAR(45) NULL,
COL3 VARCHAR(45) NULL);
CREATE TABLE SQLD_30_42_02 (
COL1 VARCHAR(45) NOT NULL,
COL2 VARCHAR(45) NULL,
COL3 VARCHAR(45) NULL);
insert into sqld_30_42_01 values('A', 'X', '1');
insert into sqld_30_42_01 values('B', 'Y', '2');
insert into sqld_30_42_01 values('C', 'Z', '3');
insert into sqld_30_42_01 values('X', 'T', '1');
insert into sqld_30_42_02 values('A', 'X', '1');
insert into sqld_30_42_02 values('B', 'Y', '2');
insert into sqld_30_42_02 values('C', 'Z', '3');
insert into sqld_30_42_02 values('D', '가', '4');
insert into sqld_30_42_02 values('E', '나', '5');
COMMIT;
DELETE FROM SQLD_30_42_01 WHERE COL1='E' OR COL1='D';
UPDATE SQLD_30_42_01 SET COL3='2' WHERE COL3='4';
SELECT * FROM SQLD_30_42_01;
SELECT * FROM SQLD_30_42_02;
MERGE INTO SQLD_30_42_01 A
USING SQLD_30_42_02 B
ON(A.COL1 = B.COL1)
WHEN MATCHED THEN
UPDATE SET A.COL3 = 4
WHERE A.COL3 = 2
DELETE WHERE A.COL3 <= 2
WHEN NOT MATCHED THEN
INSERT (A.COL1, A.COL2, A.COL3) VALUES(B.COL1, B.COL2, B.COL3);
반응형
'백엔드 > SQLD' 카테고리의 다른 글
Row Chaining & Row Migration (0) | 2020.11.29 |
---|---|
계층형 쿼리 (0) | 2020.11.29 |
서브쿼리 (0) | 2020.11.27 |
외워야되는 명령어, 함수 (0) | 2020.11.26 |
정규화 (0) | 2020.11.26 |
댓글