【问题标题】:Returning results outside of a range返回范围之外的结果
【发布时间】:2015-06-24 09:02:35
【问题描述】:

我正在尝试在 .NET 中创建预订系统。我有一个数据库,其中有一个名为 Booking、Room 和 BookingRoom 的表。

Room 包含作为 Room.RoomID 的房间号。 BookingRoom 只有两列,RoomID 和 BookingID。 Booking 有几列,但我要使用的列是 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 范围内的日期匹配的房间。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以使用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
        )
    

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,您希望在一段时间内未预订客房。一个相当直接的方法是使用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' 
                       )
      

      请注意,我更改了日期算法,因此它会发现任何重叠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多