NOT IN
쿼리 및 NULL 값 문제 해결
하위 집합에 없는 레코드를 찾기 위해 데이터베이스를 쿼리할 때 NOT IN
를 사용하면 예기치 않은 빈 결과가 나올 수 있습니다. 이는 하위 쿼리에 NULL 값이 포함된 경우에 자주 발생합니다.
문제: NOT IN
및 NULL
[Inventory].[dbo].[Stock]
에 없는 레코드를 [Subset].[dbo].[Products]
에서 검색하도록 설계된 다음 SQL 쿼리를 고려해 보세요.
<code class="language-sql">SELECT stock.IdStock, stock.Descr FROM [Inventory].[dbo].[Stock] stock WHERE stock.IdStock NOT IN (SELECT foreignStockId FROM [Subset].[dbo].[Products])</code>
foreignStockId
에 NULL이 포함된 경우 일치하는 항목이 있더라도 이 쿼리는 행을 반환하지 않을 수 있습니다. 이는 SQL의 세 가지 값 논리 때문입니다. UNKNOWN
의 NULL 결과와의 비교는 NOT IN
평가에 영향을 줍니다.
해결책: NULL 처리
이 문제를 방지하는 두 가지 효과적인 솔루션:
IS NOT NULL
:<code class="language-sql">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)</code>
NOT EXISTS
사용: 잠재적으로 더 효율적이고 명확한 접근 방식을 위해 NOT IN
를 NOT EXISTS
로 바꾸세요.<code class="language-sql">SELECT stock.idstock, stock.descr FROM [Inventory].[dbo].[Stock] stock WHERE NOT EXISTS (SELECT * FROM [Subset].[dbo].[Products] p WHERE p.foreignstockid = stock.idstock)</code>
공연:
NOT EXISTS
특히 NULL을 처리할 때 더 간단한 실행 계획을 생성하여 잠재적으로 더 나은 성능을 얻을 수 있는 경우가 많습니다.
추가 자료:
LEFT JOIN
및 기타 대안을 포함하여 이 문제에 대한 다양한 접근 방식을 보다 심층적으로 비교하려면 다음 리소스를 참조하세요.
위 내용은 NULL 값이 있을 때 내 SQL 'NOT IN' 쿼리가 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!