프린트 하기

OS 환경 : Oracle Linux 8.4 (64bit)

 

DB 환경 : Oracle Database 23.4.0.24.05 ai Free

 

방법 : 오라클 23ai 뉴피처 update, delete 시 direct join

오라클 23ai 부터 update, delete 구문에 대해 Direct Join 기능을 사용할 수 있음
이 기능은 update 나 delete 시 where 절에서 서브쿼리로 특정 컬럼 값에 필터링을 걸던 방식 대신 직접 조인을 이용할수 있는 기능임
좀더 쉽게 말하자면 update나 delete 절에 from 절을 추가로 사용할수 있게됨

 

 

구문 차이(update)

 

 

구문 차이(delete)

 

 

테스트
예를들어 아래 조건에 만족하는 데이터를 확인 한 후

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
select e.empno, e.deptno, e.ename, e.sal
from emp e, dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
     EMPNO     DEPTNO ENAME             SAL
---------- ---------- ---------- ----------
      7698         30 BLAKE            2850
      7499         30 ALLEN            1600
      7521         30 WARD             1250
      7654         30 MARTIN           1250
      7844         30 TURNER           1500
      7900         30 JAMES             950
 
6 rows selected.

 

 

d.dname = 'SALES' 조건을 만족하는 emp 테이블의 데이터를(sal 컬럼) 업데이트 하고싶은 경우

아래와 같이 쿼리를 만들어야 했음

1
2
3
4
5
6
SQL> 
update emp set sal = 9999
where deptno in 
(select deptno from dept where dname = 'SALES');
 
6 rows updated.

 

 

데이터 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
select e.empno, e.deptno, e.ename, e.sal
from emp e, dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
     EMPNO     DEPTNO ENAME             SAL
---------- ---------- ---------- ----------
      7698         30 BLAKE            9999
      7499         30 ALLEN            9999
      7521         30 WARD             9999
      7654         30 MARTIN           9999
      7844         30 TURNER           9999
      7900         30 JAMES            9999
 
6 rows selected.

정상적으로 update 됨

 

 

롤백

1
2
3
SQL> rollback;
 
Rollback complete.

 

 

하지만 23ai부터는 아래와 같이 dept 테이블을 직접 조인하는 방식으로 쿼리를 작성할 수 있음

1
2
3
4
5
6
7
SQL> 
update emp e set e.sal = 9999
from dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
6 rows updated.

 

 

데이터 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> 
select e.empno, e.deptno, e.ename, e.sal
from emp e, dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
     EMPNO     DEPTNO ENAME             SAL
---------- ---------- ---------- ----------
      7698         30 BLAKE            9999
      7499         30 ALLEN            9999
      7521         30 WARD             9999
      7654         30 MARTIN           9999
      7844         30 TURNER           9999
      7900         30 JAMES            9999
 
6 rows selected.

정상적으로 update 됨

 

 

롤백

1
2
3
SQL> rollback;
 
Rollback complete.

 

 

delete도 마찬가지로 이렇게 사용가능함
기존 delete 문

1
2
3
4
5
6
SQL> 
delete emp
where deptno in 
(select deptno from dept where dname = 'SALES');
 
6 rows deleted.

 

 

데이터 확인

1
2
3
4
5
6
7
SQL> 
select e.empno, e.deptno, e.ename, e.sal
from emp e, dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
no rows selected

정상적으로 delete 됨

 

 

롤백

1
2
3
SQL> rollback;
 
Rollback complete.

 

 

delete 구문도 23ai부터는 아래와 같이 dept 테이블을 직접 조인하는 방식으로 쿼리를 작성할 수 있음

1
2
3
4
5
6
7
SQL> 
delete emp e
from dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
6 rows deleted.

 

 

데이터 확인

1
2
3
4
5
6
7
SQL> 
select e.empno, e.deptno, e.ename, e.sal
from emp e, dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
no rows selected

정상적으로 delete 됨

 

 

롤백

1
2
3
SQL> rollback;
 
Rollback complete.

 

 

참고로 기존 delete 절에도 삭제 대상 테이블에 대해 from 을 사용할수 있었음

1
2
3
4
5
6
SQL> 
delete from emp
where deptno in 
(select deptno from dept where dname = 'SALES');
 
6 rows deleted.

 

 

이 경우에도 from 을 한번 더 사용하거나, merge 문에 사용하던 using 절을 사용할 수 있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
--from
SQL> 
delete from emp e
from dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
6 rows deleted.
 
--using
SQL>
delete from emp e
using dept d
where e.deptno = d.deptno
and d.dname = 'SALES';
 
6 rows deleted.

 

 

참조 : 

https://apex.oracle.com/pls/apex/features/r/dbfeatures/features?feature_id=1697
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/UPDATE.html#SQLRF-GUID-027A462D-379D-4E35-8611-410F3AC8FDA5
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/DELETE.html
https://medium.com/@andrei.manoliu/update-and-delete-statements-via-direct-joins-in-oracle-database-23c-f68990cfa997