>데이터 베이스 >MySQL 튜토리얼 >하위 쿼리에 NULL 값이 있을 때 내 SQL 'NOT IN' 쿼리가 결과를 반환하지 않는 이유는 무엇입니까?

하위 쿼리에 NULL 값이 있을 때 내 SQL 'NOT IN' 쿼리가 결과를 반환하지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2025-01-18 11:32:10826검색

Why Does My SQL `NOT IN` Query Return No Results When NULL Values Exist in the Subquery?

SQL의 NOT IN 절과 NULL 값 문제

SQL의 NOT IN 연산자는 열의 값이 지정된 값 집합 내에서 발견되지 않은 행을 선택하도록 설계되었습니다. 그러나 이 연산자는 비교 집합에 NULL 값이 포함되어 있으면 예기치 않게 동작합니다. 이 문서에서는 이 동작에 대해 설명하고 해결 방법을 제공합니다.

문제:

하위 데이터베이스(Inventory)에는 없는 제품을 하나의 데이터베이스(Subset)에서 찾으려는 시나리오를 생각해 보세요. NOT IN을 사용하는 일반적인 접근 방식은 다음과 같습니다.

<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>

하위 쿼리(SELECT foreignStockId FROM [Subset].[dbo].[Products])가 NULL 값을 반환하면 전체 NOT IN 조건이 불확정 상태가 되어 빈 결과 집합이 생성됩니다. IdStock[Inventory].[dbo].[Stock] 값이 에는 없습니다.[Subset].[dbo].[Products]

이런 일이 발생하는 이유:

SQL은

, TRUE, FALSE의 세 가지 값 논리를 사용합니다. 값을 UNKNOWN과 비교하면 결과는 항상 NULL입니다. UNKNOWN은 기본적으로 NOT IN모든FALSE 비교에 대해 값이 인지 확인합니다. UNKNOWN이 아니므로 하위 쿼리 결과 집합의 모든 FALSE은 전체 NULL 조건을 빈 집합으로 평가합니다.NOT IN

해결책:

이 문제를 방지하려면 다음 방법 중 하나를 사용하세요.

1. 명시적으로 NULL 제외: 값을 필터링하도록 하위 쿼리 수정: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>

2. 사용: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

값과 NULL 연산자 간의 상호 작용을 이해하면 더욱 강력하고 안정적인 SQL 쿼리를 작성할 수 있습니다. NOT IN 대안은 비교 집합의 잠재적인 NOT EXISTS 값을 처리할 때 더 깨끗하고 효율적인 솔루션인 경우가 많습니다.NULL

위 내용은 하위 쿼리에 NULL 값이 있을 때 내 SQL 'NOT IN' 쿼리가 결과를 반환하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.