SQL酒店预订系统

SQL酒店预订系统,sql,Sql,我的酒店预订系统有点问题。我无法确定哪些房间在哪一天有空。我将简化这里的表格,这样您就可以了解我要做的事情 Table 1 (ROOMS) : RoomID, RoomType (Single, Double etc) Table 2 (BOOKINGS) BookingID, RoomID, Available (Yes/No), CheckInDate, CheckOutDate, RoomType 我正在尝试根据入住、结账和房间类型在预订表中搜索可用的室友。很明显,我无法搜索它,因为现

我的酒店预订系统有点问题。我无法确定哪些房间在哪一天有空。我将简化这里的表格,这样您就可以了解我要做的事情

Table 1 (ROOMS) :
RoomID,
RoomType (Single, Double etc)

Table 2 (BOOKINGS)
BookingID,
RoomID,
Available (Yes/No),
CheckInDate,
CheckOutDate,
RoomType
我正在尝试根据入住、结账和房间类型在预订表中搜索可用的室友。很明显,我无法搜索它,因为现在里面什么都没有,即使有,它也会列出所有当前未预订的房间,所以我想我可以像这样比较房间表和预订表,并尝试通过这种方式获得一个空房间ID

SELECT RoomID FROM ROOMS 
WHERE RoomType = 'Single' AND NOT EXISTS 
(SELECT RoomID FROM BOOKINGS WHERE CheckOut >= '2013-12-02'
AND CheckIn <= '2013-12-07')
AND RoomType = 'Single' 
AND Available = 'Yes')
这将返回rooms表中的所有单人房间

示例:预订了2013-12-01至2013-12-08的1号单人房。如果我尝试使用当前逻辑预订2013-12-02至2013-12-07的房间,它返回1号房间可用。有人知道怎么做吗?尽量简单的东西优先


我在这里使用了一个简化的命名约定,只是为了让它更具可读性。

您需要关联子查询。 当前,EXISTS子查询与ROOMS上的外部查询没有任何关联。 因此,根据独立运行时EXISTS是true还是false,您将获得所有单人房间或无单人房间

像这样的方法应该会奏效:

SELECT RoomID FROM ROOMS R
WHERE RoomType = 'Single' AND NOT EXISTS 
(SELECT * FROM BOOKINGS 
 WHERE RoomID = R.RoomID
    AND CheckOutDate >= '2013-02-02'
    AND CheckInDate <= '2013-02-07'
)

我在这里举了一个SQLFIDLE示例:

为什么在两个表中都保留RoomType?似乎完全属于房间关系,与预订无关。因为我必须根据房间类型和入住/退房日期筛选结果才能找到可用的房间。为什么?你已经有RoomID了,为什么你需要过滤RoomType?快速浏览后,我可能会错过一些东西,但可能是因为你不存在,并且签入/签出日期比较有交叉?如果要排除房间,也不应该是“否”吗?有两件事:1.日期列上的数据类型实际上是“日期”还是“日期时间”?在比较这些和2时,您必须小心。您是否需要在“可用”列中存储可用性?如果有预订记录,我们是否可以假设房间不可用,如果没有记录,我们是否可以假设房间可用?当然,加快速度是基于酒店系统不太便宜的原因: