Oracle数据库使用SQL检查预留

时间:2012-03-22 09:47:21

标签: sql database oracle oracle-sqldeveloper

您好我正在创建一个允许用户预订餐厅的数据库。下面是我的数据库数据模型。

我的问题是我对如何检查特定夜晚可用的桌子有点困惑。餐厅每晚有15张桌子,4人桌子(团体可以是4到6人,大于4人的团体会占用两张桌子)。

如何查询数据库以返回给定夜晚可用的表格。

感谢。

EDIT ::

这是我尝试过的。 (其中一些是假的,因为我不太清楚该怎么做)

SELECT tables.table_id
FROM tables
LEFT JOIN table_allocation
ON tables.table_id = table_allocation.table_id
WHERE table_allocation.table_id is NULL;

这会返回空的行,因为它检查表是否存在。我不太确定如何进行日期位测试。

2 个答案:

答案 0 :(得分:3)

要查找给定THEMED_NIGHT.TEME_NIGHT_DATE上 TABLE_ALLOCATION行的TABLE行,您应该能够执行以下操作:

SELECT *
FROM TABLES
WHERE
    TABLE_ID NOT IN (
        SELECT TABLE_ALLOCATION.TABLE_ID
        FROM
            TABLE_ALLOCATION
            JOIN RESERVATION
                ON TABLE_ALLOCATION.RESERVATION_ID = RESERVATION.RESERVATION_ID
            JOIN THEMED_NIGHT
                ON RESERVATION.THEME_ID = THEMED_NIGHT.THEME_ID
        WHERE
            THEME_NIGHT_NAME = :the_date
    )

用简单的英语:

  • 加入TABLE_ALLOCATION,RESERVATION和THEMED_NIGHT,只接受指定日期(:the_date)的那些。
  • 丢弃与上面的元组相关的TABLE行(NOT IN)。
  • 剩余的那些TABLE行在晚上是免费的。

答案 1 :(得分:1)

尝试:

SELECT tables.table_id
FROM tables t
WHERE NOT EXISTS
(SELECT NULL
 FROM table_allocation a
 JOIN reservation r 
   ON a.reservation_id = r.reservation_id and 
      r.`TIME` between :Date and :Date+1
 WHERE t.table_id = a.table_id)

注意:只返回当天未在任何时间点预订的表格。