본문 바로가기
✨ DBMS/Oracle

[Oracle / SQL] MERGE INTO 사용방법 (두 테이블, 한 테이블 DUAL)

by 환풍 2023. 3. 9.
728x90

 

 

 

MELON_CHART

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE MELON_CHART (
    RANKING NUMBER
    , SINGER VARCHAR2(30NOT NULL
    , SONG VARCHAR2(200NOT NULL
    , REMARK VARCHAR2(100DEFAULT NULL
);
 
INSERT INTO MELON_CHART VALUES (1'아이유''에잇''');
INSERT INTO MELON_CHART VALUES (2'아이즈원''환상동화''');
INSERT INTO MELON_CHART VALUES (3'블루''Downtown Baby''');
INSERT INTO MELON_CHART VALUES (4'오마이걸''살짝 설렜어''');
INSERT INTO MELON_CHART VALUES (5'트와이스''More and More''');
INSERT INTO MELON_CHART VALUES (6'조정석''아로하''');
INSERT INTO MELON_CHART VALUES (7'아이유''Into the I-LAND''');
INSERT INTO MELON_CHART VALUES (8'전미도''사랑하게 될 줄 알았어''');
INSERT INTO MELON_CHART VALUES (9'조이''좋은 사람 있으면 소개시켜줘''');
INSERT INTO MELON_CHART VALUES (10'식케이''깡''');
 
SELECT * FROM MELON_CHART;
cs

MELON_CHART_NEW

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE MELON_CHART_NEW (
    RANKING NUMBER
    , SINGER VARCHAR2(30NOT NULL
    , SONG VARCHAR2(200NOT NULL
    , REMARK VARCHAR2(100DEFAULT NULL
);
 
INSERT INTO MELON_CHART_NEW VALUES (1'세븐틴''Left and Right''');
INSERT INTO MELON_CHART_NEW VALUES (2'아이즈원''환상동화''');
INSERT INTO MELON_CHART_NEW VALUES (3'블랙핑크''How You Like That''');
INSERT INTO MELON_CHART_NEW VALUES (4'화사''마리아''');
INSERT INTO MELON_CHART_NEW VALUES (5'조이''좋은 사람 있으면 소개시켜줘''');
INSERT INTO MELON_CHART_NEW VALUES (6'아이유''Into the I-LAND''');
INSERT INTO MELON_CHART_NEW VALUES (7'트와이스''More and More''');
INSERT INTO MELON_CHART_NEW VALUES (8'오마이걸''살짝 설렜어''');
INSERT INTO MELON_CHART_NEW VALUES (9'지코''Summer Hate''');
INSERT INTO MELON_CHART_NEW VALUES (10'선미''보랏빛 밤''');
 
SELECT * FROM MELON_CHART_NEW;
cs

 

MERGE INTO

1
2
3
4
5
6
7
MERGE INTO MELON_CHART M1
USING MELON_CHART_NEW M2
ON (M1.SINGER = M2.SINGER AND M1.SONG = M2.SONG)
WHEN MATCHED THEN
    UPDATE SET M1.RANKING = M2.RANKING, M1.REMARK = 'CONTINUE'
WHEN NOT MATCHED THEN
    INSERT VALUES (M2.RANKING, M2.SINGER, M2.SONG, 'NEW');
cs
SELECT * FROM MELON_CHART;

위와 같이 MELON_CHART에 있는 값을 다시한번 조회하면 5개의 새로운 데이터가 추가된 것을 확인할 수 있다.

 

ON 조건절에 MELON_CHART의 SINGER가 MELON_CHART_NEW의 SINGER와 같고, 노래가 같은 것을 조건으로 둔다.

 

WHEN 일치하면,

MELON_CHART_NEW의 랭킹을 MELON_CHART로 바꿔주고, REMARK 값을 CONTINUE로 업데이트 시킨다.

 

WHEN NOT 일치하지 않다면,

MELON_CHART_NEW의 RANKING, SINGER, SONG REMARK 데이터 모두 MELON_CHART 값에 추가해준다.

 


DUAL (하나의 테이블)

다른 테이블과의 비교 뿐만 아니라, 하나의 테이블 내에서 직접 값을 넣는 형식으로 DUAL을 사용할 수도 있다.

 

1
2
3
4
5
6
7
8
MERGE INTO MELON_CHART M2
USING DUAL
ON (SINGER='환풍' AND SONG ='백만장자 사나이')
WHEN MATCHED THEN
    UPDATE SET REMARK = 'GOOD'
WHEN NOT MATCHED THEN
    INSERT (RANKING, SINGER, SONG, REMARK)
    VALUES (11,'환풍','억만장자 사나이''RE');
cs
SELECT * FROM MELON_CHART;

USING에 DUAL을 넣고, 조건을 준 결과 WHEN NOT MATCHED THEN 절로 출력한 결과가 아래에 있다.

 


업데이트

1
2
3
4
5
6
7
8
MERGE INTO MELON_CHART M2
USING DUAL
ON (SINGER='환풍' AND SONG ='억만장자 사나이')
WHEN MATCHED THEN
    UPDATE SET RANKING =1
WHEN NOT MATCHED THEN
    INSERT (RANKING, SINGER, SONG, REMARK)
    VALUES (12,'환풍','억만장자 사나이''RE');
cs
SELECT * FROM MELON_CHART;


삭제

 

1
2
3
4
5
6
7
8
9
10
11
MERGE INTO MELON_CHART M2
USING DUAL
ON (SINGER='환풍' AND SONG ='억만장자 사나이')
WHEN MATCHED THEN
    UPDATE SET SINGER='환풍'
    WHERE RANKING =1
    DELETE
    WHERE RANKING =1
WHEN NOT MATCHED THEN
    INSERT (RANKING, SINGER, SONG, REMARK)
    VALUES (12,'환풍','억만장자 사나이''RE');
cs

위와 같이 ON 조건절에서 사용했던 컬럼을 업데이트하면 오류가 발생된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
MERGE INTO MELON_CHART M2
USING DUAL
ON (SINGER='환풍' AND SONG ='억만장자 사나이')
WHEN MATCHED THEN
    UPDATE SET REMARK='RE'
    WHERE RANKING =1
    DELETE
    WHERE RANKING =1
WHEN NOT MATCHED THEN
    INSERT (RANKING, SINGER, SONG, REMARK)
    VALUES (12,'환풍','억만장자 사나이''RE');
cs

SONG에 있는 '환풍' 데이터가 모두 사라진 것을 확인할 수 있다.

반응형

댓글