SQL 쿼리 질문: 선택 ... 아닌

뭔가 어리석은 실수를 하고 있는 것은 분명하지만, 도대체 무슨 실수인지 알 수가 없습니다:

SQL Server 2005에서 오전 2시 이전에 예약한 고객을 제외한 모든 고객을 선택하려고 합니다.

이 쿼리를 실행하면

SELECT idCustomer FROM reservations 
WHERE idCustomer NOT IN 
  (SELECT distinct idCustomer FROM reservations 
   WHERE DATEPART ( hour, insertDate) < 2)

결과가 0개입니다.

하지만

SELECT idCustomer FROM reservations 

는 152.000개의 결과와 'NOT IN' 부분을 반환합니다:

SELECT distinct idCustomer FROM reservations 
WHERE DATEPART ( hour, insertDate) < 2

는 284개 행만 반환합니다.

질문에 대한 의견 (2)
해결책
SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2
  and idCustomer is not null

목록 매개변수에 널 값이 포함되어 있지 않은지 확인하세요.

여기에 설명이 있습니다:

WHERE field1 NOT IN (1, 2, 3, null)

와 동일합니다:

WHERE NOT (field1 = 1 OR field1 = 2 OR field1 = 3 OR field1 = null)
  • 마지막 비교는 null로 평가됩니다.
  • 이 널은 나머지 부울 표현식과 OR 연산되어 널을 산출합니다. (*)
  • null이 부정되어 null이 산출됩니다.
  • null이 참이 아닌 경우 - where 절은 참 행만 유지하므로 모든 행이 필터링됩니다.

(*) 편집: 이 설명은 꽤 훌륭하지만, 향후의 오해의 소지를 없애기 위해 한 가지를 언급하고 싶습니다. (TRUE 또는 NULL)은 TRUE로 평가됩니다. 예를 들어 field1 = 3인 경우에 해당됩니다. 이 TRUE 값은 FALSE로 부정되고 행이 필터링됩니다.

해설 (1)

39 의 it& 항상 가질 수 있는 '에서' NULL '위험한' 목록 - 흔히 '에서' 가 아닌 '없음' 것으로 매개변수처럼 작동합니다.

IF 1 NOT IN (1, 2, 3, NULL) PRINT '1 NOT IN (1, 2, 3, NULL)'
IF 1 NOT IN (2, 3, NULL) PRINT '1 NOT IN (2, 3, NULL)'
IF 1 NOT IN (2, 3) PRINT '1 NOT IN (2, 3)' -- Prints
IF 1 IN (1, 2, 3, NULL) PRINT '1 IN (1, 2, 3, NULL)' -- Prints
IF 1 IN (2, 3, NULL) PRINT '1 IN (2, 3, NULL)'
IF 1 IN (2, 3) PRINT '1 IN (2, 3)'
해설 (2)

SQL 2005를 사용하는 경우 다음을 시도해 볼 수도 있습니다. 오라클의 MINUS 명령과 유사합니다(UNION과 반대).

하지만 디버그를 위해 DATEPART(시간, insertDate) 열을 추가하는 것도 좋습니다.

SELECT idCustomer FROM reservations 
EXCEPT
SELECT idCustomer FROM reservations WHERE DATEPART ( hour, insertDate) < 2
해설 (0)

39 점, 하지만 정말 I& 경우, ve 누락했습니다 wouldn& # 39, t, s # 39 의 다음 책임질래 그리웠댔지 it& İç?

SELECT distinct idCustomer FROM reservations 
WHERE DATEPART(hour, insertDate) >= 2
해설 (2)
SELECT Reservations.idCustomer FROM Reservations (nolock)
LEFT OUTER JOIN @reservations ExcludedReservations (nolock) ON Reservations.idCustomer=ExcludedReservations.idCustomer AND DATEPART(hour, ExcludedReservations.insertDate) < 2
WHERE ExcludedReservations.idCustomer IS NULL AND Reservations.idCustomer IS NOT NULL
GROUP BY Reservations.idCustomer

[업데이트: 원래 게시자의 주요 문제였던 idCustomer가 NULL인 경우 처리하는 추가 기준을 추가했습니다.]

해설 (2)
SELECT MIN(A.maxsal) secondhigh
FROM (
      SELECT TOP 2 MAX(EmployeeBasic) maxsal
      FROM M_Salary
      GROUP BY EmployeeBasic
      ORDER BY EmployeeBasic DESC
     ) A
해설 (1)
select * from table_name where id=5 and column_name not in ('sandy,'pandy');
해설 (1)