안녕하세요.. merge 질문드립니다.. 1 3 1,073

by kimmmmmmm [Oracle 기초] merge delete [2018.03.15 20:16:02]


안녕하세요

      * Table A

        0    100

        1    100

     * Table B

        0    200

        2    300

     * merge후 최종 Table A

        0    200

        2    300

이렇게 A테이블에 두개의 row가 있고,

B테이블에 두개의 row가 있습니다.

merge into A using B를 통하여

'0'->'0'으로 업데이트

A테이블의 '1'은 B 테이블에 없음으로 삭제

B테이블의 '2'는 A 테이블에 없음으로 인설트를 하고싶은데

merge문으로 이게 가능한가요 ?

by 마농 [2018.03.16 09:05:23]
-- 1. 그냥 Truncate 후 Insert 하면 안되나요?
TRUNCATE TABLE t1;
INSERT INTO t1 SELECT * FROM t2;
-- 2. Delete 만 별도 수행하는 방법
DELETE FROM t1 a WHERE NOT EXISTS (SELECT 0 FROM t2 b WHERE b.id = a.id);
-- 3. Merge
MERGE INTO t1 a
USING
(
SELECT NVL(a.id, b.id) id
     , b.v
     , NVL2(b.id, 0, 1) delete_flag
  FROM t1 a
  FULL OUTER JOIN t2 b
    ON a.id = b.id
 WHERE a.id IS NULL    -- Insert
    OR b.id IS NULL    -- Delete
    OR a.v != b.v      -- Update
) b
ON (a.id = b.id)
WHEN MATCHED THEN
  UPDATE SET a.v = b.v
  DELETE WHERE delete_flag = 1
WHEN NOT MATCHED THEN
  INSERT VALUES(b.id, b.v)
;

 


by 우리집아찌 [2018.03.16 09:22:27]

DELETE를 FLAG로 만들어서 쳐리하셨네요..

놀라운데요.. 생각도 못했네요. 

 


by 우리집아찌 [2018.03.16 09:07:03]

DELETE 문을 따로 쓰셔야합니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입