SQL의 NOT IN
절 문제 해결: 실패할 수 있는 이유 및 해결 방법
SQL NOT IN
절은 한 테이블에서 다른 테이블에는 존재하지 없는 행을 선택하도록 설계되었습니다. 그러나 특히 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])</code>
이 쿼리는 특정 레코드를 제외해야 하는 경우에도 결과를 반환하지 않을 수 있습니다.
근본 원인: NULL
가치
문제는 NULL
테이블의 foreignStockId
열에 있는 Products
값에서 발생합니다. SQL의 NOT IN
연산자는 NULL
과 함께 예기치 않게 동작합니다. NULL
을 포함하는 비교는 항상 UNKNOWN
을 초래하며, 이는 WHERE
절의 전체 부울 논리에 영향을 미칩니다.
효과적인 솔루션:
이 문제를 해결할 수 있는 믿을 수 있는 두 가지 방법은 다음과 같습니다.
NULL
s: 필터링 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
사용: 이 연산자는 더 강력하고 종종 더 효율적인 대안을 제공합니다.<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
비교
성능 최적화:
두 솔루션 모두 정확하지만 성능은 다를 수 있습니다. NOT EXISTS
일반적으로 특히 대규모 데이터 세트의 경우 더 간단하고 잠재적으로 더 빠른 실행 계획으로 이어집니다. 그러나 foreignStockId
열에 NULL
값이 없으면 NOT IN
의 성능이 약간 더 좋아질 수 있습니다. 최적의 솔루션을 결정하려면 특정 환경에서 두 가지 접근 방식을 모두 테스트하는 것이 가장 좋습니다.
위 내용은 내 SQL `NOT IN` 절이 예상한 결과를 반환하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!