我正在尝试用.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 :(得分: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'
)
请注意,我更改了日期算术,以便找到任何重叠。