2. 핵심 원리
2.1 표준 방식: 상관 서브쿼리 UPDATE
UPDATE 대상
SET 컬럼 = (SELECT 값 FROM 원천 WHERE 원천.키 = 대상.키)
WHERE EXISTS (SELECT 1 FROM 원천 WHERE 원천.키 = 대상.키);SET 의 서브쿼리는 대상의 각 행마다 실행되어 값 하나를 돌려줍니다. 원천에 짝이 없으면 서브쿼리가 NULL 을 돌려주고, UPDATE 는 그 NULL 을 그대로 씁니다. 그래서 WHERE EXISTS 로 짝 있는 행만 대상으로 좁혀야 합니다.
서브쿼리가 한 행보다 많이 돌려주면 오류입니다. 원천의 키가 유일해야 안전합니다.
핵심상관 서브쿼리
UPDATE는WHERE EXISTS와 한 쌍입니다. 빼면 짝 없는 행이 NULL 로 바뀝니다. 이 함정은 모든 DB 가 같습니다.
2.2 DB 별 조인 UPDATE·DELETE
| 작업 | Oracle · Tibero | MySQL | MSSQL |
|---|---|---|---|
| 조인 UPDATE | 상관 서브쿼리, MERGE, 조인 뷰 | UPDATE t JOIN s ON ... SET |
UPDATE t SET ... FROM t JOIN s |
| 조인 DELETE | WHERE EXISTS |
DELETE t FROM t JOIN s ON ... |
DELETE t FROM t JOIN s ON ... |
| 표준 상관 서브쿼리 | 가능 | 가능 | 가능 |
| 조건별 다중 INSERT | INSERT ALL·INSERT FIRST |
없음 | 없음 |
Oracle 은 전통적으로 조인 UPDATE 가 없었습니다. 상관 서브쿼리, MERGE, 갱신 가능 조인 뷰를 씁니다. 조인 뷰는 키 보존 테이블만 수정할 수 있고 아니면 ORA-01779 가 납니다. Oracle 23ai 부터는 UPDATE ... FROM 과 DELETE ... FROM 으로 직접 조인할 수 있습니다.
2.3 INSERT ALL 과 INSERT FIRST
INSERT ALL
WHEN 조건1 THEN INTO 표1 (...) VALUES (...)
WHEN 조건2 THEN INTO 표2 (...) VALUES (...)
SELECT ... FROM 원천;Oracle 9i 부터 있고 Tibero 도 지원합니다. ALL 은 원천의 각 행이 맞는 조건마다 모두 넣고, FIRST 는 처음 맞는 WHEN 하나에만 넣습니다. 원천은 한 번만 읽습니다. MySQL·MSSQL 에는 이 문법이 없습니다.