문제. 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 |