본문 바로가기

프로그래밍/SQL

EXISTS, IN



문제. A 테이블, B 테이블
서로 ID 라는 필드가 존재하며, 해당 필드값은 A,B 양쪽모두 동일해야한다.
단, B테이블에서 제거되어 NULL 이 되었고,
A테이블 내 ID필드값 은 여전히 존재한다.

게임으로 생각해보자면..
B 캐릭터 정보 테이블, A 캐릭터 인벤토리 아이템 테이블
캐릭터가 삭제되었으나, 인벤토리 소지템이 DB 에 여전히 쓰레기값으로 존재하고 있다.
이를 지워야한다.

처음 while 문으로 해당 값을 비교하여 일일이 지워줄까도 생각해봤다..
하지만 이작업은 존나 느리다. 방대한 데이터베이스일수록..
아래 작업을 이용하면 바로 단 한줄로 모든게 해결된다.


EXISTS나 IN을 이용하면 편하게 구할 수 있습니다.

SELECT ID FROM B WHERE NOT EXISTS (SELECT * FROM A WHERE B.ID=A.ID)

SELECT * FROM B WHERE ID NOT IN(SELECT ID FROM A)

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

살짝 덧붙이자면… 아래처럼 날리면 ID와 NULL 상태가 뜹니다.

SELECT B.ID AS ID, A.ID AS STATE FROM B LEFT OUTER JOIN A ON A.ID=B.ID

LEFT OUTER JOIN은 왼쪽 테이블(B) 기준으로 오른쪽 테이블(A)에 데이터가 없으면 NULL로 표시됩니다.

예)
ID STATE
:
177 177
178 NULL
179 179
:

아래처럼 번호를 구할 수 있지요.

SELECT ID FROM (SELECT B.ID AS ID, A.ID AS STATE FROM B LEFT OUTER JOIN A ON A.ID=B.ID) AS TBL WHERE STATE IS NULL

ID
:
178
:

먼저 검색을 해봤다. 잘 찾아진다!
자 이제 이걸 DELTE문으로 바꿔 주면 끝!

'프로그래밍 > SQL' 카테고리의 다른 글

[오라클] 데이터 해시 방법  (0) 2014.12.08
INSERT SELECT  (0) 2013.08.31
MULTI DELETE  (0) 2012.01.25