如何从德比嵌入式数据库

时间:2016-12-07 08:17:05

标签: sql derby

我正在建立一个酒店管理系统,我被困在找到指定日期的可用房间。我有两个表,即房间和预订

Rooms Table
| RoomID | Name | Floor | Bed | Rent | RoomType|

Reservation Table
| ResvID | RoomId | CheckIn | CheckOut | CustomerID |

预订表中的外键是RoomId。

我想要的就是获得可用的房间(在指定日期没有预订)。我的应用程序还提供添加新房间的功能。所以只是加入Reservation表并没有给我想要的结果,因为新的房间永远不会在预订表中。我还想过滤BedType和RoomType。我使用了以下查询

 SELECT DISTINCT r.RoomID, r.RoomNo, r.Name, r.Floor, r.RoomType, r.Rent
 FROM hms.rooms r
 JOIN hms.reservation rv
   ON r.RoomID = rv.ROOM_ID
 WHERE (((rv.CHECKIN < ? AND  --Checkin Provided
         rv.CHECKOUT <= ?) OR  --Checkin Provided
         (rv.CHECKIN >= ? AND --Checkout Provided
         rv.CHECKOUT > ?)) AND --Checkout Provided
         rv.CHECKIN <> ? AND rv.CHECKOUT <> ?) AND  -- Checkin/Checkoutprovided
         (r.RoomType = ? AND  --RoomType provided
         r.Bed = ?)  --BedType provided
  UNION
  SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent
  FROM hms.rooms AS r WHERE r.RoomID NOT IN(
  SELECT ROOM_ID FROM hms.reservation) AND
 (r.RoomType = ? AND r.Bed = ?)  --Room?BedType provided

此查询不起作用。它总是显示房间。

修改:尝试使用此代码但仍显示可用空间

SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent
  FROM hms.rooms r
WHERE r.RoomID NOT IN
 (SELECT ROOM_ID
    FROM hms.reservation rv
  WHERE(
       ((rv.CHECKIN <= ?) AND --in
        (rv.CHECKOUT  > ? AND rv.CHECKOUT < ?)) OR --in/out

        ((rv.CHECKIN < ? AND rv.CHECKIN > ?) AND --out/in
        (rv.CHECKOUT >= ?)) OR --out

        (rv.CHECKIN > ? AND rv.CHECKOUT < ?) OR --in/out

        (rv.CHECKIN = ? AND rv.CHECKOUT = ?) OR --in/out

        (rv.CHECKIN < ? AND  rv.CHECKOUT > ?) --in/out

    ) AND

    (r.RoomType = ? AND r.Bed = ?)

1 个答案:

答案 0 :(得分:0)

请提供一些示例数据并指出失败的原因以及预期结果应该是什么。如果我理解正确,您正试图找到一个在指定的签到结账范围内不会保留的房间。也许是这样的:

SELECT RoomID, RoomNo, Name, Floor, RoomType, Rent
  FROM hms.rooms r
  WHERE r.RoomID NOT IN (SELECT ROOM_ID
                           FROM hms.reservation rv
                           WHERE rv.CHECKIN  < :p_checkout
                             AND rv.CHECKOUT > :p_checkin
                        )
    AND r.RoomType = :p_room_type AND r.Bed = :p_bed_type

即。如果在我的结帐(:p_checkout)之前有预订并且在我的签到(:p_checkin)之前没有完成预订,则从可用房间列表中排除预留的房间。