When doing a MERGE in Oracle SQL, how can I update rows that aren't matched in the SOURCE?

oracle, sql, sql-merge

Solution

You can do it with a separate UPDATE statement

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

I don't know of any way to integrate this into your MERGE statement.

Problem

I have a `main` database and a `report` database, and I need to sync a table from `main` into `report`. However, when an item gets deleted in the `main` database, I only want to set an `IsDeleted` flag in the `report` database. What is an elegant way to do this? I'm currently using a MERGE statement, like this: ``` 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...) ; ``` The `WHEN NOT MATCHED` statement gives me all NEW values from `main`, but I also want to update all OLD values from `report`. I'm using Oracle PL/SQL.

Original source

Related problems