2015-06-24 159 views
0

我试图在.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范围内的日期相匹配的房间。

回答

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 
    ) 
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' 
       ) 

注意,我改变了日期计算,因此会发现任何重叠。

相关问题