작동하지 않는 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
,OUTER APPLY
,LEFT OUTER JOIN
,EXCEPT
, 또는NOT EXISTS
? NOT IN
vs.NOT EXISTS
vs.LEFT JOIN / IS NULL
: SQL ServerLeft outer join
vsNOT EXISTS
NOT EXISTS
vsNOT IN
경우 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
'IT박스' 카테고리의 다른 글
Python 함수 포인터 (0) | 2020.11.07 |
---|---|
0.0으로 나눌 때 Java에서 예외가 발생하지 않는 이유는 무엇입니까? (0) | 2020.11.07 |
파이썬에서 문자열이 숫자로 시작하는지 확인하는 방법은 무엇입니까? (0) | 2020.11.07 |
(xxxx xxxx xxxx xxxx)와 같은 신용 카드 입력을위한 UITextField 서식 지정 (0) | 2020.11.06 |
django runserver를 다시 시작할 때 포트를 '삭제'하는 방법 (0) | 2020.11.06 |