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
'ORACLE > Admin' 카테고리의 다른 글
오라클 23ai 신기능 group by 시 alias 및 position 사용 (0) | 2024.05.07 |
---|---|
오라클 23ai 신기능 if [not] exists 구문 (0) | 2024.05.05 |
오라클 23ai 신기능 pdb 기동순서 조정 (2) | 2024.05.03 |
오라클 OCI 2024 Generative AI Professional 무료 강의 및 무료 자격증 (0) | 2024.05.02 |
오라클 23ai 신기능 update 시 default on null for update (0) | 2024.04.26 |