티스토리 뷰

나참 어처구니가 없는 일이 발생했다. 그 이유는 아래에서 설명 하겠다. 일단 오라클의 exists에 대해 살펴보면


가장 기본적으로


select * from A
where not exists (select * from B
                 where A.c1 = B.c1)
=> A가 B에 존재하지 않는 것을 조회

 

select * from A
where exists (select * from B
                 where A.c1 = B.c1)
=> A가 B에 존재하는 것을 조회 



select 도 되고 exists를 이용하여 삭제도 가능 하다.

DELETE FROM EMP A
 WHERE EXISTS (
        SELECT 1
          FROM DEPT B
         WHERE A.DEPTNO = B.DEPTNO
           AND B.DEPTNO = '20'
        );

 

그 밖의 삭제 방법

DELETE FROM EMP A
 WHERE A.DEPTNO =  (
        SELECT B.DEPTNO
          FROM DEPT B
         WHERE A.DEPTNO = B.DEPTNO
           AND B.DEPTNO = '20'
        );
        
        
DELETE FROM EMP A
 WHERE (A.DEPTNO, A.ENAME) =  (
        SELECT B.DEPTNO, B.NAME
          FROM DEPT B
         WHERE B.DEPTNO = '20'
        );


이런식으로 사용가능 하는데..


위에서 말한 문제는 배치가 도는데 특정 테이블 데이터가 삭제되는 것이였다. 한참을 디버깅 해보면서 찾아보니 어처구니 없게도


delete from A
where exists (select * from B
                 where A.c1 <> B.c1);


이런식으로 써야 되는데


delete from A
where exists (select * from A, B
                 where A.c1 <> B.c1);


이런식으로 썼다. 여러분, 무슨일이 일어날건지 상상이 가능 하겠습니까?


저렇게 쓰면 값이 다른게 없다면 아무일도 일어나지 않으나, 값이 다른게 1건이상 있으면 A테이블의 데이터가 모두 삭제 된다.


차이점이 이해 되시나요? 한번 테스트 해보시길..^^


개발자를 잘 뽑아야 한다... 아니다 싶으면.. 과감히..

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함