返回范围之外的结果

时间:2015-06-24 00:57:26

标签: sql sql-server

我正在尝试用.NET制作预订系统。我有一个名为Booking,Room和BookingRoom的数据库。

房间包含房间号码Room.RoomID。 BookingRoom只有两个列,RoomID和BookingID。 预订有几列,但我想使用的是CheckInDate和CheckOutDate以及BookingID的列。

房间 - > BookingRoom - >预订

我现在就在这里:

SELECT DISTINCT r.RoomID
FROM Room r
RIGHT JOIN BookingRoom br ON br.RoomID = r.RoomID
RIGHT JOIN Booking b ON b.BookingID = br.BookingID
RIGHT JOIN Rates ra ON r.RateID = ra.RateID
WHERE (b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999') AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999');

这不幸地给了我所有房间的清单,因为它不包括该范围内的房间,房间号码与其他房间的预订相匹配。

现在我不能为我的生活找出是否可以返回房间列表,不包括与CheckInDate和CheckOutDate范围内的日期匹配的房间。

2 个答案:

答案 0 :(得分:0)

您可以使用NOT EXISTS

SELECT
    r.RoomID
FROM Room r
WHERE
    NOT EXISTS(
        SELECT 1
        FROM Booking b
        INNER JOIN BookingRoom br
            ON br.BookingID = b.BookingID
        WHERE
            (b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999') 
            AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999')
            AND br.RoomID = r.RoomID
    )

答案 1 :(得分:0)

如果我正确理解您的问题,您需要一段时间未预订的房间。一种相当直接的方法是使用EXISTS

SELECT r.*
FROM Room r
WHERE NOT EXISTS (SELECT 1
                  FROM BookingRoom br JOIN
                       Booking b
                       ON b.BookingID = br.BookingID
                  WHERE b.CheckInDate < '2015-06-28' AND
                        b.CheckOutDate >= '2015-06-21' 
                 )

请注意,我更改了日期算术,以便找到任何重叠。