2015-11-04 41 views
1

你好傢伙正試圖顯示給定日期的所有可用汽車列表,我嘗試使用BETWEEN但未成功。 在車表中添加另一個字段(狀態)並查詢狀態是一個好主意。有一個好方法嗎?或者使用return_date之間的booking_date顯示效果更好?列出給定日期的所有可用汽車SQL

預訂:

id customer_id car_id booking_date return_date time_stamp  
------ ----------- ------ ------------ ----------- ---------------- 
    1   2  5 2015-11-04 2015-11-12 15.06.10 20:10 
    2   3  2 2015-11-02 2015-11-13 15.06.10 20:10 
    3   1  11 2015-11-05 2015-11-16 15.06.10 20:10 
    4   4  8 2015-11-10 2015-12-16 15.06.10 20:10 
    5   0  0 0000-00-00 0000-00-00 15.06.10 20:10 

CarType:

id car_type_id branch_id registration_number color date_of_manifacturing base_price_per_day 
------ ----------- --------- ------------------- ------- --------------------- -------------------- 
    1   1   1 BG-123-431   Bela  2010-11-15        30 
    2   2   1 BG-A32-212   Metalik 2015-11-04        30 
    3   3   2 PA-332-421   Metalik 2008-05-03        35 
    4   4   1 SM-312-542   Crna  2014-06-01        35 
    5   5   1 BG-4393-54   Crna  2012-05-03        50 
    6   6   1 NS-423-64   Bela  2010-10-08        50 

汽車:

id car_type_id branch_id registration_number color date_of_manifacturing base_price_per_day 
------ ----------- --------- ------------------- ------- --------------------- -------------------- 
    1   1   1 BG-123-431   Bela  2010-11-15        30 
    2   2   1 BG-A32-212   Metalik 2015-11-04        30 
    3   3   2 PA-332-421   Metalik 2008-05-03        35 
    4   4   1 SM-312-542   Crna  2014-06-01        35 
    5   5   1 BG-4393-54   Crna  2012-05-03        50 
    6   6   1 NS-423-64   Bela  2010-10-08        50 

我的所有預訂我列出這樣的:

SELECT BOOKING.BOOKING_NUMBER, BOOKING.BOOKING_DATE, 
BOOKING.RETURN_DATE, AGENCY.NAME, CAR.REGISTRATION_NUMBER, 
CAR_TYPE.NAME 
FROM BOOKING 
JOIN AGENCY ON BOOKING.AGENCY_ID = AGENCY.ID 
JOIN CAR ON CAR.ID = BOOKING.CAR_ID 
JOIN CAR_TYPE ON CAR_TYPE.ID = CAR.CAR_TYPE_ID 

但是,對於所有可用的車輛,我不知道。 任何示例?

回答

1

使用您的booking表就可以知道什麼車單日@checkDate

SELECT * 
FROM BOOKING 
WHERE @checkDate BETWEEN booking_date AND return_date 

因此,要獲得該日期可用的汽車,你使用的都是書:

SELECT * 
FROM Cars 
WHERE car_id not in (
         SELECT car_id 
         FROM BOOKING 
         WHERE @checkDate BETWEEN booking_date AND return_date 
        ) 

或完整查詢

SELECT 
     BOOKING.BOOKING_NUMBER, BOOKING.BOOKING_DATE, 
     BOOKING.RETURN_DATE, AGENCY.NAME, 
     CAR.REGISTRATION_NUMBER, CAR_TYPE.NAME 
FROM BOOKING 
JOIN AGENCY ON BOOKING.AGENCY_ID = AGENCY.ID 
JOIN CAR ON CAR.ID = BOOKING.CAR_ID 
JOIN CAR_TYPE ON CAR_TYPE.ID = CAR.CAR_TYPE_ID 
WHERE 
    CAR.car_id not in (
         SELECT car_id 
         FROM BOOKING 
         WHERE @checkDate BETWEEN booking_date AND return_date 
        ) 
+0

我認爲對於數據量較大的'NOT IN'數據較慢? Beeter使用'不存在' – Ivan

+0

我只是給你最安全的解決方案。您也可以嘗試在@checkDate和booking_date和return_date之間'左連接BOOKING,但是因爲我沒有數據不想猜。這樣你就可以''NULL'''沒有預訂'汽車 –

+0

我認爲如果你有'booking_date和return_date'的索引就可以。其他的解決方案是使用'EXISTS',但只有通過測試你的數據才能知道什麼是最好的 –

1

您可以使用LEFT JOIN

SELECT 
    CAR.REGISTRATION_NUMBER, 
    CAR_TYPE.NAME, 
    AGENCY.NAME, 
    CASE 
    WHEN BOOKING.CAR_ID IS NULL THEN 'Not Booked' 
    ELSE 'Booked' 
    END AS Status, 
    BOOKING.BOOKING_NUMBER, 
    BOOKING.BOOKING_DATE, 
    BOOKING.RETURN_DATE 
FROM CAR 
INNER JOIN CAR_TYPE ON CAR_TYPE.ID  = CAR.CAR_TYPE_ID 
LEFT JOIN BOOKING ON CAR.ID   = BOOKING.CAR_ID 
LEFT JOIN AGENCY ON BOOKING.AGENCY_ID = AGENCY.ID; 

這會給你所有可用的車,如果有車有沒有預訂它會與預訂和代理NULL值,而Status欄將顯示它是否預訂與否。

相關問題