it-source

Oracle SQL에서 MERGE를 수행할 때 소스에서 일치하지 않는 행을 업데이트하려면 어떻게 해야 합니까?

criticalcode 2023. 7. 20. 21:59
반응형

Oracle SQL에서 MERGE를 수행할 때 소스에서 일치하지 않는 행을 업데이트하려면 어떻게 해야 합니까?

나는 있습니다main데이터베이스 및report데이터베이스에서 테이블을 동기화해야 합니다.main안으로report.

그러나 항목이 삭제된 경우main데이터베이스, 설정만 하고 싶습니다.IsDeleted의 깃발.report데이터베이스

이것을 하는 우아한 방법은 무엇입니까?

현재 다음과 같은 MERGE 문을 사용하고 있습니다.

MERGE INTO report.TEST target
USING (SELECT * FROM main.TEST) source
   ON (target.ID = source.ID)
WHEN MATCHED THEN
    UPDATE SET (target... = source...)
WHEN NOT MATCHED THEN
    INSERT (...) VALUES (source...)
;

WHEN NOT MATCHED스테이트먼트는 모든 새로운 가치를 제공합니다.main또한 모든 OLD 값을 업데이트하고 싶습니다.report.

Oracle PL/SQL을 사용하고 있습니다.

별도의 UPDATE 문으로 수행할 수 있습니다.

UPDATE report.TEST target
SET    is Deleted = 'Y'
WHERE  NOT EXISTS (SELECT 1
                   FROM   main.TEST source
                   WHERE  source.ID = target.ID);

나는 이것을 당신의 MERGE 문에 통합할 어떤 방법도 모릅니다.

다음 답변은 데이터를 동일한 테이블로 병합하는 것입니다.

MERGE INTO YOUR_TABLE d
USING (SELECT 1 FROM DUAL) m
    ON ( d.USER_ID = '123' AND d.USER_NAME= 'itszaif') 
WHEN NOT MATCHED THEN
        INSERT ( d.USERS_ID, d.USER_NAME)
        VALUES ('123','itszaif');

이 명령은 다음 항목을 확인합니다.USER_ID그리고.USER_NAME일치하는 경우 일치하지 않으면 삽입됩니다.

MERGE INTO target
USING
(
    --Source data
    SELECT id, some_value, 0 deleteMe FROM source
    --And anything that has been deleted from the source
    UNION ALL
    SELECT id, null some_value, 1 deleteMe
    FROM
    (
        SELECT id FROM target
        MINUS
        SELECT id FROM source
    )
) source
   ON (target.ID = source.ID)
WHEN MATCHED THEN
    --Requires a lot of ugly CASE statements, to prevent updating deleted data
    UPDATE SET target.some_value =
        CASE WHEN deleteMe=1 THEN target.some_value ELSE source.some_value end
    ,isDeleted = deleteMe
WHEN NOT MATCHED THEN
    INSERT (id, some_value, isDeleted) VALUES (source.id, source.some_value, 0)

--Test data
create table target as
select 1 ID, 'old value 1' some_value, 0 isDeleted from dual union all
select 2 ID, 'old value 2' some_value, 0 isDeleted from dual;

create table source as
select 1 ID, 'new value 1' some_value, 0 isDeleted from dual union all
select 3 ID, 'new value 3' some_value, 0 isDeleted from dual;


--Results:
select * from target;

ID  SOME_VALUE   ISDELETED
1   new value 1  0
2   old value 2  1
3   new value 3  0
merge into x as target using y as Source on target.ID = Source.ID
when not matched by target then insert
when matched then update
when not matched by source and target.ID is not null then
update whatevercolumn = 'isdeleted' ;

언급URL : https://stackoverflow.com/questions/10539627/when-doing-a-merge-in-oracle-sql-how-can-i-update-rows-that-arent-matched-in-t

반응형