prosource

SQL 쿼리 질문: SELECT... 입력

probook 2023. 8. 26. 11:58
반응형

SQL 쿼리 질문: SELECT... 입력

나는 분명히 어리석은 실수를 하고 있지만 무엇인지 알 수 없습니다.

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개 행만 반환합니다.

SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2
  and idCustomer is not null

목록 매개 변수에 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이 생성됩니다.
  • null은 true가 아닙니다. 여기서 절은 실제 행만 유지하므로 모든 행이 필터링됩니다.

(*) 편집: 이 설명은 꽤 좋지만, 저는 미래의 트집을 잡지 않기 위해 한 가지를 다루고 싶습니다. (TRUE or NULL)은 TRUE로 평가할 것입니다.예를 들어 필드 1 = 3인 경우 이 값이 관련됩니다.이 TRUE 값은 FALSE로 음수가 되고 행은 필터링됩니다.

항상 위험한 일이 있습니다.NULL에서IN목록 - 종종 예상대로 동작합니다.IN하지만 그것을 위한 것은 아닙니다.NOT IN:

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

SQL 2005를 고려할 때, 당신은 이것도 시도할 수 있습니다. 이것은 오라클의 MINUS 명령과 비슷합니다(UNION의 반대).

그러나 디버그를 위해 DATEPART(시간, 날짜 삽입) 열을 추가하는 것도 제안합니다.

SELECT idCustomer FROM reservations 
EXCEPT
SELECT idCustomer FROM reservations WHERE DATEPART ( hour, insertDate) < 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

[업데이트:원래 포스터의 주요 문제였던 ID Customer가 NULL인 것을 처리하기 위한 추가 기준 추가]

요점을 놓쳤다면 미안하지만, 다음은 당신이 원하는 것을 알아서 하지 않을까요?

SELECT distinct idCustomer FROM reservations 
WHERE DATEPART(hour, insertDate) >= 2
SELECT MIN(A.maxsal) secondhigh
FROM (
      SELECT TOP 2 MAX(EmployeeBasic) maxsal
      FROM M_Salary
      GROUP BY EmployeeBasic
      ORDER BY EmployeeBasic DESC
     ) A
select * from table_name where id=5 and column_name not in ('sandy,'pandy');

언급URL : https://stackoverflow.com/questions/296146/sql-query-question-select-not-in

반응형