반응형
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
반응형
'it-source' 카테고리의 다른 글
컨테이너 객체(Python)에 __iter__(자체)를 구현하는 방법 (0) | 2023.07.20 |
---|---|
Oracle에서 일주일 중 첫 번째와 마지막 날을 얻는 방법은 무엇입니까? (0) | 2023.07.20 |
python: 디렉터리를 두 단계 위로 가져옵니다. (0) | 2023.07.20 |
SQL Server를 사용하여 빈 공간을 null 값으로 변환하는 방법은 무엇입니까? (0) | 2023.07.20 |
Oracle SQL의 'limit' 절 "SQL 명령이 제대로 종료되지 않음" (0) | 2023.07.20 |