반응형
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 |