[Oracle] 멀 티 탭 관련 update 와 delete

Oracle 은 update 나 delete from 문 구 를 지원 하지 않 기 때문에 Oracle 의 다 중 표 관련 update 와 delete 는 반드시 하위 조회 에 의존 해 야 합 니 다. 마찬가지 로 Oracle 도 동시에 update 나 delete 여러 장의 표를 지원 하지 않 습 니 다. 그 전형 적 인 용법 은 다음 과 같 습 니 다.
다 중 표 관련 update
우선, 구조 테스트 표 와 데 이 터 는 다음 과 같다.
SYS@TEST16> create table testa as select owner,table_name,status from dba_tables;

Table created.
SYS@TEST16> create table testb as select owner,object_name,status from dba_objects;

Table created.
1) testa 표를 업데이트 하 는 status = 'VALID', 관련 조건 은 testa. owner = testb. owner and testa. tablename=testb.table_name
update testa a set status='VALID'
where exists (select 1 from testb b where a.owner=b.owner and a.table_name=b.object_name);
2) testa 표를 업데이트 하 는 status 는 testb 표 의 status 와 같 고 관련 조건 은 같 습 니 다.
update testa a 
set a.status=(select b.status from testb b where a.owner=b.owner and a.table_name=b.object_name)
where exists (select 1 from testb b where a.owner=b.owner and a.table_name=b.object_name);
여기 서 주의해 야 할 것 은 한 개의 데이터 만 되 돌려 줄 때 상기 문 구 는 성공 적 으로 실 행 될 수 있 고 한 개의 데 이 터 를 넘 으 면 다음 과 같은 오류 가 발생 할 수 있 습 니 다.
ORA-01427: single-row subquery returns more than one row
이때, 당신 은 하위 조회 의 반환 항목 수 를 한정 해 야 합 니 다. 예 를 들 어 rownum = 1 또는 distinct 등 방법 입 니 다.
여기 where exists 문 구 는 생략 할 수 없습니다. 그렇지 않 으 면 update 전체 표!여기 조심 하 세 요.
실행 계획 을 보면 상기 update 문 구 는 testb 표를 두 번 스 캔 합 니 다. 이 표 가 크 면 성능 에 영향 을 줄 수 있 습 니 다. 한 번 만 스 캔 하려 면 다음 과 같은 방법 으로 대체 할 수 있 습 니 다.
update testa a
set a.status=nvl((select b.status from testb b where a.owner=b.owner and a.table_name=b.object_name),a.status);

update 자체 열 은 때때로 자신의 값 을 이용 하여 자신의 열 을 업데이트 해 야 할 수도 있 습 니 다. 예 를 들 어 표 test 의 열 col 1, col 2 에 빈 칸 이 있 습 니 다. 우 리 는 trim 에서 빈 칸 을 제거 해 야 합 니 다. 이때 우 리 는 rowid 를 이용 하여 업데이트 할 수 있 습 니 다. update 문 구 는 다음 과 같 습 니 다.
update test a
set (col1,col2)=
(select trim(b.col1),trim(b.col2) from test b
where  a.rowid=b.rowid)
where exists
(select 1 from test b
where  a.rowid=b.rowid)

다 중 표 관련 delete
1) in 또는 not in 을 이용 하여 데 이 터 를 삭제 합 니 다.
delete from testa where table_name 
in (select object_name from testb);
2) exists 또는 not exists 를 이용 하여 데 이 터 를 삭제 합 니 다.
delete from testb b
where exists 
(select 1 from testa a where a.owner=b.owner and a.table_name=b.object_name)

좋은 웹페이지 즐겨찾기