DELETE 명령시 두 테이블 이상의(Join된) 결과 값 삭제 - ROWID


[CODE type=oracle8]SELECT *
FROM A
, B
WHERE A.USR = B.USR(+);[/CODE]


<결과>
USR ID USR TMP
----------- ----------- ----------- -----------
2 48 2 62
3 4 3 75
3 4 3 13
13 55
22 67

5 rows selected.


즉, 좌측은 USR, ID 컬럼은 A Table, 우측 USR, TMP는 B Table을 의미

[가정]
A.USR와 B.USR는 조인조건
B의 TMP가 62인 값이 데이터를 삭제 하려고 할 경우

[CODE type=oracle8]DELETE FROM B
WHERE TMP = 62;[/CODE]
명령을 수행하면 B테이블의 값은 지워지지만 A테이블의 값은 지울 수가 없다.
그럴 경우 ROWID IN이란 명령을 사용하면 된다.

B테이블에 지워야할 조건을 가지고 있으므로 먼저 지워서는 안된다.

[CODE type=oracle8]DELETE FROM A
WHERE ROWID IN (
SELECT A.ROWID
FROM A
, B
WHERE A.USR = B.USR
AND B.TMP = 62
);

DELETE FROM B
WHERE TMP = 62;[/CODE]

<결과>
1 rows Deleted
1 rows Deleted


그렇다면 ROWID IN 안의 결과 값이 궁금할 것이다.
(아래 결과는 데이터 삭제 전에 나온 값입니다.)

[CODE type=oracle8]SELECT A.ROWID
FROM A
, B
WHERE A.USR = B.USR
AND B.TMP = 62;[/CODE]


<결과>
ROWID
-------------------
AAAHI8AAGAAIHQWAAD

1 rows selected.

음.. 무슨 뜻일까...? ㅋ
(아래 결과는 데이터 삭제 전에 나온 값입니다.)

[CODE type=oracle8]SELECT ROWID FROM A;[/CODE]

<결과>
ROWID
-------------------
AAAHI8AAGAAIHQWAAA
AAAHI8AAGAAIHQWAAB
AAAHI8AAGAAIHQWAAC
AAAHI8AAGAAIHQWAAD

4 rows selected.

Oracle에서는 테이블의 각 행에 ROWID란 고유 번호를 가지고 있는 것 같다.^^
3개 이상 테이블 삭제시는 삭제할 ROWID를 따로 임시 테이블을 만들어서
삭제하면 편리할 듯 하다^^

본 실험은 Oracle 9i에서 하였습니다.


Powered by Tattertools