Where The Streets Have No Name

오라클 'where not in' 사용 시 정말 유의할 점 본문

Developement/DataBase

오라클 'where not in' 사용 시 정말 유의할 점

highheat 2006. 6. 27. 15:31
'where not in' 사용 시 정말 유의할 점!!!

초보팁 : http://www.chobotip.com/phpBB2/viewtopic.php?t=433

Number컬럼을 하나 가진 Table 1과 Table 2를 만들어 보겠습니다.

코드:
      Create table Table1 (A number);
      Insert into Table1 Values(1);
      Insert into Table1 Values(2);

      Create table Table2 (A number);
      Insert into Table2 Values(1);
      Insert into Table2 Values(Null);


다음에 'not in'을 이용한 SQL을 만들어 보겠습니다.

코드:
      Select A
      from Table1
      Where A not in (
            Select A from Table2
      );


위의 SQL은 Table2에는 포함되지 않고 Table1에만 포함된 레코드를 추출하기 위한 것입니다. 그러면 원래 의도대로라면 컬럼 A의 값이 2인 레코드만 추출이 되어야 겠지요?

하지만 위의 SQL을 수행하면 아무것도 select되지 않습니다.

왜냐하면 Table2에 NULL이 포함되어 있기 때문입니다.

위의 SQL에서 SELECT가 되기 위해선 Table1의 값이 Table2에 속한 모든 값과 달라야 합니다. 일단 Table1에서 컬럼 A의 값이 '1'인 레코드는 Table2에도 해당 레코드가 있으니 당연히 나오지 않겠지요.

그럼 Table1에서 컬럼 A의 값이 '2'인 레코드는 왜 나오지 않을까요? 그것은 오라클 내부적으로 다음과 같은 내부연산이 이루어지기 때문이라고 합니다.

코드:
Table 1      Table 2    비교결과(Table1의 값과 Table2 값이 다른가?)
2                1              True
2                NULL        NULL


NULL은 값이 미확정되어 있다는 뜻입니다. 따라서 NULL과의 비교는 true/false를 알 수 없기 때문에 결과도 NULL로 처리합니다. 오라클은 레코들의 비교결과를 최종적으로 'AND' 연산하는데, 이 때 TRUE AND NULL의 결과 역시 NULL이기 때문에 결과적으로 아무런 레코드도 select되지 않는 것 입니다.

잘 이해가 안가더라도, 항상 이것만 주의하면 됩니다.

컬럼에 NULL이 포함되어 있으면 절대 'not in' 서브 쿼리를 사용하면 안됩니다!!