IT박스

작동하지 않는 SQL NOT IN

itboxs 2020. 11. 7. 09:06
반응형

작동하지 않는 SQL NOT IN


두 개의 데이터베이스가 있는데 하나는 인벤토리를 보유하고 다른 하나는 기본 데이터베이스 레코드의 하위 집합을 포함합니다.

다음 SQL 문이 작동하지 않습니다.

SELECT  stock.IdStock
        ,stock.Descr       
FROM    [Inventory].[dbo].[Stock] stock
WHERE   stock.IdStock NOT IN
        (SELECT foreignStockId FROM
         [Subset].[dbo].[Products])

안 작동하지 않습니다. NOT을 제거하면 올바른 결과, 즉 두 데이터베이스에있는 제품이 제공됩니다. 그러나 NOT IN을 사용하면 결과가 전혀 반환되지 않습니다.

내가 뭘 잘못하고 있니?


SELECT foreignStockId
FROM   [Subset].[dbo].[Products]  

아마도 NULL.

NOT IN있는 경우 쿼리는 모든 행을 반환하지 않습니다 NULL의이 목록에있는 NOT IN값. IS NOT NULL아래와 같이 명시 적으로 제외 할 수 있습니다 .

SELECT stock.IdStock,
       stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL) 

또는 NOT EXISTS대신 사용하여 다시 작성하십시오 .

SELECT stock.idstock,
       stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock) 

실행 계획에서 원하는 의미를 갖는 것뿐만 아니라 여기에서 보는 것처럼NOT EXISTS 종종 더 간단 합니다 .

동작의 차이에 대한 이유 는 SQL에서 사용되는 세 가지 값 논리 때문 입니다. 술어를 평가할 수있다 True, False또는 Unknown.

WHERE절은로 평가되어야 True반환되는 행의 순서를하지만이 불가능 NOT IN할 때 NULL아래에 설명 된대로 존재한다.

'A' NOT IN ('X','Y',NULL) 다음과 같다 'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)

  • 'A'<> 'X'= True
  • 'A'<> 'Y'= True
  • 'A'<> NULL = Unknown

True AND True AND Unknown세 가지 가치 논리에 대한 진리표Unknown따라 평가됩니다 .

다음 링크에는 다양한 옵션의 성능에 대한 추가 설명이 있습니다.


경우 NOT IN이 없는 작업을 수행, 당신은 항상 시도 할 수 있습니다 LEFT가 가입 . 그런 다음 조인 된 테이블의 값 중 하나 인 NULL을 사용하여 WHERE로 필터링 합니다 . 다만, 당신에 의해 결합 된 값이 포함되지 않은 모든 NULL의 값입니다.


Case 절을 ​​사용하여 이러한 문제를 해결할 수도 있습니다.

SELECT  stock.IdStock
        ,stock.Descr        
FROM    [Inventory].[dbo].[Stock] stock
WHERE   (Case when stock.IdStock IN
        (SELECT foreignStockId FROM
        [Subset].[dbo].[Products]) then 1 else 0 end) = 0 

이 구문은 SQL Server, Oracle 및 postgres에서 작동합니다.

참고 URL : https://stackoverflow.com/questions/5231712/sql-not-in-not-working

반응형