2014-12-07 1 views
0

예약 시스템을 조회하고 있으며 모든 예약 일정 (반복 예약을 나타냄)을 지정해야합니다. 여기서 지정된 날짜의 모든 예약 범위가 취소되었습니다. 다음 질문이 이 취소 된 특정 날짜 범위 동안 예약이 포함 된 예약 예약을 내게주는 이유는 무엇입니까?SQL - 날짜 범위의 모든 예약이 취소 된 예약 일정 검색

SELECT DISTINCT b.BookingScheduleId FROM Booking b 
WHERE b.CancellationStatus = 1 
    AND b.[Date] BETWEEN '01-Nov-14' AND '31-Dec-14' 
    AND NOT EXISTS (
     SELECT * FROM Booking ref 
     WHERE ref.BookingScheduleId = b.BookingScheduleId 
      AND ref.[Date] BETWEEN '01-Nov-14' AND '31-Dec-14' 
      AND b.CancellationStatus = 0 
     ) 
    AND b.BookingScheduleId IS NOT NULL 

답변

1
내가 ANSI 표준 날짜 사용하여 쿼리를 작성하여 시작할 것

: 다음 밑줄 친 부분에 유의하고 쿼리를 조금 바꿔 것

SELECT DISTINCT b.BookingScheduleId 
FROM Booking b 
WHERE b.CancellationStatus = 1 AND 
     b.[Date] BETWEEN '2014-01-14' AND '2014-12-31' AND 
     NOT EXISTS (SELECT 1 
        FROM Booking ref 
        WHERE ref.BookingScheduleId = b.BookingScheduleId AND 
         ref.[Date] BETWEEN '2014-01-14' AND '2014-12-31' AND 
         b.CancellationStatus = 0 
-----------------------^ 
       ) AND 
     b.BookingScheduleId IS NOT NULL; 

을 :

SELECT s.BookingScheduleId 
FROM (SELECT DISTINCT BookingScheduleId 
     FROM Booking b 
     WHERE b.CancellationStatus = 1 AND 
      b.[Date] BETWEEN '2014-01-14' AND '2014-12-31' AND 
      b.BookingScheduleId IS NOT NULL 
    ) s 
WHERE NOT EXISTS (SELECT 1 
        FROM Booking ref 
        WHERE ref.BookingScheduleId = s.BookingScheduleId AND 
         ref.[Date] BETWEEN '2014-01-14' AND '2014-12-31' AND 
         ref.CancellationStatus = 0 
       ); 

내가 선호를 필터링을 수행하고 서브 쿼리로 구별하십시오. 아마 (실행 계획을 보거나 성능을 측정하지 않고도 알 수는 없지만) 하위 쿼리가 후보 일정을 얻고 외부의 하나가 not exists을 사용하는 필터링을 수행하기 때문에 더 명확합니다. 그런데이 쿼리를 집계 쿼리로 사용할 수도 있지만이 형식으로 남겨 두었습니다.이 쿼리가 사용자의 의도 인 것 같습니다.

+0

감사합니다. 이런 식으로 분할하는 것이 훨씬 명확합니다. 문제는 내 마지막 'AND'가 'NOT EXISTS'상태의 일부로 작동한다는 것입니다. – Izzy

+0

@ azzy. . . 나는 이러한 유형의 문제를 피하기 위해 쿼리 형식을 지정하는 방법에 대해 매우 세심한주의를 기울이고 있습니다.하지만 모든 사람들이 내 미학과 동의하지는 않습니다. –