본문 바로가기
백엔드/SQLD

MERGE

by 1005ptr 2020. 11. 27.
반응형

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

댓글