홈 › SQL 고급 › 10 / 10

다른 테이블 기준으로 수정·삭제

조인 UPDATE·DELETE 와 INSERT ALL
섹션 6진행 0 / 10

2. 핵심 원리

2.1 표준 방식: 상관 서브쿼리 UPDATE

sql
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

sql
INSERT ALL
  WHEN 조건1 THEN INTO 표1 (...) VALUES (...)
  WHEN 조건2 THEN INTO 표2 (...) VALUES (...)
SELECT ... FROM 원천;

Oracle 9i 부터 있고 Tibero 도 지원합니다. ALL 은 원천의 각 행이 맞는 조건마다 모두 넣고, FIRST 는 처음 맞는 WHEN 하나에만 넣습니다. 원천은 한 번만 읽습니다. MySQL·MSSQL 에는 이 문법이 없습니다.