by 써니신랑 [SQL Query] MERGE ORACLE [2020.04.01 23:55:19]
MERGE INTO people_target pt USING people_source ps ON (pt.person_id = ps.person_id) WHEN matched THEN UPDATE SET pt.first_name = ps.first_name, pt.last_name = ps.last_name, pt.title = ps.title DELETE where pt.title = 'Mrs.' WHEN NOT matched THEN INSERT (pt.person_id, pt.first_name, pt.last_name, pt.title) VALUES (ps.person_id, ps.first_name, ps.last_name, ps.title) WHERE ps.title = 'Mr';
이 상태로는 merge문 수행이 잘 되는것 같습니다.
한 가지 궁금한점은 여기에 추가로 WHEN matched THEN UPDATE를 여러개 사용할수 있는지 입니다.
아래처럼 WHEN matched 일때 특정 조건별로 여러개의 UPDATE문을 사용하는것이 가능한지 알고 싶습니다.
WHEN matched AND pt.first_name = 'AAA' THEN UPDATE
SET pt.last_name = ps.last_name
WHEN matched AND pt.first_name = 'BBB' THEN UPDATE
SET pt.first_name = ps.first_name
WHEN matched AND pt.first_name = 'CCC' THEN UPDATE
SET pt.first_name = ps.first_name,
pt.last_name = ps.last_name
실제 사용하는 로직은 조건별로 UPDATE 대상 컬럼, 로직이 복잡하여 조건별로 UPDATE절을 따로 만들어야 하는 상태입니다.
혹시 오라클에서는 이런식의 여러개 UPDATE절이 불가능한가요? 제가 MS-SQL은 가능하다고 본거 같아서요
CASE문으로 가능하지 않을까요..?
MERGE INTO people_target pt USING people_source ps ON (pt.person_id = ps.person_id) WHEN matched THEN UPDATE SET pt.last_name = CASE WHEN pt.first_name = 'AAA' THEN ps.last_name WHEN pt.first_name = 'BBB' THEN pt.last_name WHEN pt.first_name = 'CCC' THEN ps.last_name END, pt.first_name = CASE WHEN pt.first_name = 'AAA' THEN pt.first_name WHEN pt.first_name = 'BBB' THEN ps.first_name WHEN pt.first_name = 'CCC' THEN ps.first_name END;
구문은 문법에 맞게 써야 합니다. 맘대로 고쳐 쓸수는 없구요.
하나의 SQL 문장 안에서 조건에 따라 분기해야 한다면? CASE 문등을 사용할 수는 있겠죠.
프로그램에서 IF 문으로 분기하여 동적SQL 로 구성할수도 있구요.
WHEN matched THEN UPDATE SET pt.first_name = CASE WHEN pt.first_name IN ('BBB','CCC') THEN ps.first_name ELSE pt.first_name END , pt.last_name = CASE WHEN pt.first_name IN ('AAA','CCC') THEN ps.last_name ELSE pt.last_name END