with available_car as (
select
C.car_id
, C.car_type
, duration_type
, discount_rate
, daily_fee
, round(daily_fee*(100-discount_rate)*0.01*30) as fee
from CAR_RENTAL_COMPANY_CAR C
join CAR_RENTAL_COMPANY_RENTAL_HISTORY H on C.car_id = H.car_id
join CAR_RENTAL_COMPANY_DISCOUNT_PLAN P on C.car_type = P.car_type
where C.car_type in ('세단', 'SUV')
and C.car_id not in (
select car_id
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where not (start_date > '2022-11-30' or end_date < ' 2022-11-01')
)
and duration_type like '30일 이상%'
group by C.car_id
)
select
car_id
, car_type
, fee
from
available_car
where fee >= 500000 and fee < 2000000
order by fee desc, car_type, car_id desc
available_car절의 where 조건절이 중요하다.
where ...
and C.car_id not in (
select car_id
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where not (start_date > '2022-11-30' or end_date < ' 2022-11-01')
...
not in ~ not
명시한 기간 조건이 아닌 car_id를 뽑고, 또 이 car_id에 속하지 않는 car_id가 최종적으로 구해야 하는 값이다.
말이 너무 헷갈린다^^;
그냥 대충 이중부정 = 긍정 아님?
C.car_id in (
select car_id
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where (start_date > '2022-11-30' or end_date < ' 2022-11-01')
이렇게 하면 다른 결과가 나온다.
첫번째 케이스는, 11월에 대여가 불가능한 차를 모두 찾고 이를 제외한다.
두번째 케이스는, 11월에 대여가 가능한 차를 모두 찾는다.
이렇게 보면 똑같은 말이라고 생각할 수 있지만,
history_id | car_id | start_date | end_date |
---|---|---|---|
603 | 18 | 2022-09-06 00:00:00 | 2022-09-07 00:00:00 |
609 | 18 | 2022-09-09 00:00:00 | 2022-09-12 00:00:00 |
619 | 18 | 2022-09-13 00:00:00 | 2022-09-15 00:00:00 |
629 | 18 | 2022-09-16 00:00:00 | 2022-10-16 00:00:00 |
694 | 18 | 2022-10-19 00:00:00 | 2022-10-19 00:00:00 |
700 | 18 | 2022-10-21 00:00:00 | 2022-10-22 00:00:00 |
712 | 18 | 2022-10-25 00:00:00 | 2023-01-26 00:00:00 |
508 | 27 | 2022-08-01 00:00:00 | 2022-08-02 00:00:00 |
512 | 27 | 2022-08-03 00:00:00 | 2022-08-04 00:00:00 |
521 | 27 | 2022-08-05 00:00:00 | 2022-08-06 00:00:00 |
536 | 27 | 2022-08-09 00:00:00 | 2022-08-16 00:00:00 |
576 | 27 | 2022-08-24 00:00:00 | 2022-09-23 00:00:00 |
660 | 27 | 2022-09-25 00:00:00 | 2022-12-24 00:00:00 |
car_id 18의 history_id 712, card_id 27의 history_id 660 은 대여가 불가능하다. 하나라도 대여 불가능한 이력이 있으면 그 차는 대여가 불가능한 것이다.
따라서 첫번째 케이스에서는 이를 방지해주지만,
두번째 케이스에서는 가능한 것이 하나라도 있으면 포함이기 때문에
전혀 다른 결과를 내는 것이다.