업데이트가 다른 데이터 테이블의 데이터로 업데이트될 때 조건이 부과되지 않으면 모든 데이터가 업데이트되어 예기치 않은 결과가 발생합니다.
1. 데이터 테이블 생성
CREATE TABLE TEMP_TEST(
IDN NUMBER,
NM VARCHAR2(10)
);
2. 데이터 삽입
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. 잘못된 업데이트
테이블에서 IDN 2의 데이터 NM을 HELLO로 업데이트할 계획이며 업데이트 후 다른 데이터와 일치하는 데이터를 업데이트하고 일치하지 않는 데이터는 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. 올바른 업데이트
! 업데이트는 업데이트된 범위를 추가하는 것입니다.
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
);