2014-03-18 4 views
3

나는 TSQL 쿼리 작성 방법을 배우고 있습니다. 나는 그들을 깊이 이해하려고 노력하고있다. 튜토리얼에서 얻은이 쿼리는 두 번째 WHERE 절에서 NOT NULL을 확인해야한다.IN 키워드를 사용하여 쿼리

SELECT * 
FROM Person.Person AS p 
WHERE NOT p.BusinessEntityID IN (
    SELECT PersonID 
    FROM Sales.Customer 
    WHERE PersonID IS NOT NULL); 

이제 Sales.Customer 테이블에는 PersonID에 대한 일부 NULL 값이 있습니다. 하위 쿼리에서이 WHERE 절을 제거하면 결과가 반환되지 않습니다. 문제에 대한 내 잘못한 생각에, 하위 쿼리가 NULL을 반환하면 단순히 외부 쿼리에서 WHERE 절의 조건을 충족시키지 못할 것이라고 생각합니다. PersonID가 NULL이 아닌 행에 대한 결과 세트를 가져올 것으로 예상됩니다. 왜이 추론에 따라 작동하지 않습니까?

+0

이 쿼리는 아직 고객이 아닌 사람들의 결과를 생산하기 위해 노력하고있는 것으로 보인다. Persons.Person에서 BusinessEntityId가 NULL이 아닌 값 목록에없는 행 목록을 제공한다고 말하고 있습니다. 하위 쿼리는 Persons가 null이 아닌 위치를 명시하여 공백 집합이나 null이 아닌 값 집합을 반환합니다. –

+1

SQL Server에서 NULL 값을 처리하는 방법을 이해하는 것이 새 사용자에게는 어려울 수 있습니다. NULL 값은 값을 알 수 없음을 나타냅니다. NULL 값은 빈 값 또는 0 값과 다릅니다. 두 개의 null 값이 동일하지 않습니다. 두 개의 널값 간 또는 널값과 다른 값 사이의 비교는 각 NULL의 값을 알 수 없기 때문에 알 수 없음을 리턴합니다. http://technet.microsoft.com/en-us/library/ms191504(v=sql.105).aspx – DMason

+0

@DMason 귀하는 답변으로 의견을 작성해야합니다. – Crono

답변

2

SQL Server에서 NULL 값을 처리하는 방법을 이해하는 것이 새 사용자에게는 어려울 수 있습니다. NULL 값은 값을 알 수 없음을 나타냅니다. NULL 값은 빈 값 또는 0 값과 다릅니다. 두 개의 null 값이 동일하지 않습니다. 두 개의 널값 간 또는 널값과 다른 값 사이의 비교는 각 NULL의 값을 알 수 없기 때문에 알 수 없음을 리턴합니다.

Null Values

+0

내 질문에 답해 주셔서 감사합니다. – user3366675

1

아래 (column not in)과 같이 약간의 변화

SELECT * 
FROM Person AS p 
WHERE p.BusinessEntityID NOT IN ( <-- Here 
    SELECT PersonID 
    FROM Sales.Customer 
    WHERE PersonID IS NOT NULL); 

귀하의 내부 쿼리가 반환 null이 아닌 모든 personid와 BusinessEntityID가 personid에 속하지 않는 제한 사람이 테이블의 모든 필드 을 받고 외부 쿼리.

0

NULL은 UNKNOWN으로 설명 될 수도 있습니다. 따라서 하위 쿼리에서 하나의 NULL이 반환되면 SQL Server는 값이 결과에 포함되는지 여부를 알 수 없으므로 행을 반환하지 않습니다.