서브쿼리 없는 UPDATE:
Direct Join으로 DML 단순화하기
Oracle 26ai에서는 UPDATE와 DELETE 문에 FROM 절을 직접 사용할 수 있습니다. 복잡한 서브쿼리를 줄여 조인 관계를 더 명확하게 표현할 수 있습니다.
기존 방식은 무엇이 불편했을까?
기존 Oracle에서는 다른 테이블의 값을 참조해 UPDATE하려면 상관 서브쿼리나 MERGE 문을 사용해야 했습니다. 같은 조인 조건이 여러 번 나타나기 쉬워 문장이 길어지고, 실제 변경 대상을 한눈에 파악하기 어려웠습니다.
핵심 변화
26ai부터는 변경할 테이블 뒤에 FROM 절을 두고 소스 테이블을 직접 조인할 수 있습니다.
Direct Join UPDATE 문법
SQL
UPDATE products p
SET price = c.new_price
FROM price_changes c
WHERE p.prod_id = c.prod_id;products가 변경 대상이고 price_changes가 값을 제공하는 소스 테이블입니다. WHERE 절의 조인 결과를 기준으로 제품 가격을 갱신합니다.
반드시 확인할 제약 조건
하나의 타깃 행은 최대 한 번만 변경되어야 합니다. 소스의 여러 행이 동일한 타깃 행과 매칭되면 Oracle은 어느 값을 적용해야 하는지 안정적으로 결정할 수 없으므로 다음 오류가 발생합니다.
CODE
ORA-30926: unable to get a stable set of rows
in the source tables| 조인 관계 | 결과 | 설명 |
|---|---|---|
| 소스 1 → 타깃 1 | 정상 | 타깃 행이 한 번만 변경됨 |
| 소스 N → 동일 타깃 1 | ORA-30926 | 같은 타깃 행이 여러 번 변경 대상이 됨 |
정리
- Direct Join DML은 조인 관계를 문장 구조에서 바로 확인할 수 있습니다.
- 소스 데이터의 중복으로 하나의 타깃 행이 여러 번 매칭되지 않도록 해야 합니다.
- 운영 적용 전에는 조인 결과의 유일성을 먼저 검증하는 것이 안전합니다.
02
여기까지 이해하셨나요?
완료하면 계정의 스터디 진도에 반영됩니다.