When update is updated with data from other data tables, if no conditions are imposed, all data will be updated, resulting in unexpected results
1. Create a data table
CREATE TABLE TEMP_TEST(
IDN NUMBER,
NM VARCHAR2(10)
);
2. Insert data
INSERT INTO TEMP_TEST VALUES(1, 'A');
INSERT INTO TEMP_TEST VALUES(2, 'D');
INSERT INTO TEMP_TEST VALUES(3, 'C');
INSERT INTO TEMP_TEST VALUES(4, 'D');
COMMIT;
3. Wrong update
It is planned to update the data NM of IDN 2 in the table to HELLO, after the update, the data matched by other data is updated, and the unmatched data is set to NULL
UPDATE TEMP_TEST T
SET T.NM =
( WITH WA AS (SELECT 2 IDN, 'HELLO' AS NM FROM DUAL)
SELECT NM
FROM WA A
WHERE A.IDN = T.IDN
);
4. Correct updates
! Update is to add the updated range
UPDATE TEMP_TEST T
SET T.NM =
( WITH WA AS (SELECT 2 IDN, 'HELLO' AS NM FROM DUAL)
SELECT NM
FROM WA A
WHERE A.IDN = T.IDN
)
WHERE EXISTS(
WITH WA AS (SELECT 2 IDN, 'HELLO' AS NM FROM DUAL)
SELECT 1 FROM WA B WHERE B.IDN = T.IDN
);