I am trying to update flag column based on cif. I cant figure it out. Kindly help to make update/merge query
You can use a correlated UPDATE
:
UPDATE table_name t
SET flag = (SELECT x.flag
FROM table_name x
WHERE t.cif = x.cif
AND x.flag IS NOT NULL
AND ROWNUM = 1)
WHERE flag IS NULL;
Slightly more complicated but (probably) more efficient would be to use MERGE
and correlate on the ROWID
pseudo-column (which is a pointer to the row):
MERGE INTO table_name dst
USING (
SELECT max_flag
FROM (
SELECT flag,
MAX(flag) OVER (PARTITION BY cif) AS max_flag
FROM table_name
)
WHERE flag IS NULL
AND max_flag IS NOT NULL
) src
ON (dst.ROWID = src.ROWID)
WHEN MATCHED THEN
UPDATE
SET flag = src.max_flag;
Which, for the sample data:
CREATE TABLE table_name (cif, flag) AS
SELECT 120, 'SF' FROM DUAL UNION ALL
SELECT 120, 'NA' FROM DUAL UNION ALL
SELECT 151, 'NA' FROM DUAL UNION ALL
SELECT 156, 'MF' FROM DUAL UNION ALL
SELECT 156, 'MF' FROM DUAL UNION ALL
SELECT 165, NULL FROM DUAL UNION ALL
SELECT 165, 'SF' FROM DUAL UNION ALL
SELECT 165, 'SF' FROM DUAL UNION ALL
SELECT 158, 'MF' FROM DUAL UNION ALL
SELECT 158, NULL FROM DUAL;
Then, after the UPDATE
or MERGE
, the table contains:
CIF | FLAG |
---|---|
120 | SF |
120 | NA |
151 | NA |
156 | MF |
156 | MF |
165 | SF |
165 | SF |
165 | SF |
158 | MF |
158 | MF |