I have the following table that I need to update:
USER: | ID | ACTIVE | REF_COL | COL_2 | COL_3 | |----|--------|---------|-------|-------| | 1 | 1 | value | value | value | | 2 | 0 | value | value | value | | 3 | 1 | value | value | value |
I execute the following two UPDATE statements separately:
Statement-1
UPDATE USER SET ACTIVE = 1 WHERE REF_COL IN ( -- Subquery that generates a list of values )Statement-2
UPDATE USER SET ACTIVE = 0 WHERE REF_COL NOT IN ( -- Subquery that generates a list of values )
The Subquery that generates a list of values is the same for both of the UPDATE queries.
Is there any way which will help me to execute the query at once, like MERGE?
The following query using MERGE statement is invalid:
MERGE INTO USER U
USING (
-- Subquery that generates a list of values
) T
ON (U.REF_COL = T.VALUE)
WHEN MATCHED THEN
UPDATE SET U.ACTIVE = 1
WHEN NOT MATCHED THEN
UPDATE SET U.ACTIVE = 0
Since the WHEN NOT MATCHED THEN clause expects to have an INSERT statement.
Advertisement
Answer
Here is a merge version with example. You have to place logic in source part:
merge into users tgt
using (
select u.ref_col, nvl2(s.ref_col, 1, 0) active
from users u
left join subquery s on u.ref_col = s.ref_col ) src
on (tgt.ref_col = src.ref_col)
when matched then update set active = src.active;