酒店 - 单人预订,多个房间有多个家属

时间:2013-03-19 20:24:51

标签: sql oracle

我正在尝试列出某位客人的家属。预订酒店时,客人可携带朋友或孩子(家属)。但是,预订客房时,每间客房仅可容纳3人。因此,如果一位客人带来了4个人,其中2个家属将留在102房间,其他3个房间位于103房间。但是他们在同一个预订下可以说预订id = 2002.

我正在尝试使用sql oracle查询来显示某个预订的所有家属。以下是我尝试过的可行的方法:

SELECT b.BOOKINGID,
       b.GUESTID,
       d.DEPENDANTID,
       d.FORENAME AS firstname,
       d.SURNAME AS lastname,
       br.FLOORNO,
       br.ROOMNO
FROM  BOOKING b
      LEFT JOIN BOOKINGDEPENDANT bd
      ON b.BOOKINGID = bd.BOOKINGID
      LEFT JOIN DEPENDANT d
      ON d.DEPENDANTID = bd.DEPENDANTID
      LEFT JOIN BOOKINGROOM br
      ON b.BOOKINGID = br.BOOKINGID
WHERE b.BOOKINGID = &BOOKINGID;  

我在上述查询中遇到的问题是它能够列出所有家属,但是当预订与多个房间相关联时,它会多次列出它们。

例如,预订2002使用房间102和103.因此所有家属都与103相关联,包括那些住在103中的家属。同样适用于103.

2 个答案:

答案 0 :(得分:1)

您需要在家属和房间之间进行映射。您拥有的是从预订到家属的映射以及从预订到房间的单独映射。

我假设您在BookingDependant中有房间ID。如果是这样,那么from子句将是:

FROM  BOOKING b
      LEFT JOIN BOOKINGDEPENDANT bd
      ON b.BOOKINGID = bd.BOOKINGID
      LEFT JOIN DEPENDANT d
      ON d.DEPENDANTID = bd.DEPENDANTID
      LEFT JOIN BOOKINGROOM br
      ON bd.BookingId = br.BOOKINGID and
         bd.BookingRoomId = br.BookingRoomId

此构造假设进行预订的单个人在BookingDependent表中。

如果您没有为每个受抚养者提供宽限期,请从查询中删除该房间:

SELECT b.BOOKINGID, b.GUESTID, d.DEPENDANTID,
       d.FORENAME AS firstname, d.SURNAME AS lastname
FROM  BOOKING b
      LEFT JOIN BOOKINGDEPENDANT bd
      ON b.BOOKINGID = bd.BOOKINGID
      LEFT JOIN DEPENDANT d
      ON d.DEPENDANTID = bd.DEPENDANTID
WHERE b.BOOKINGID = &BOOKINGID; 

您没有从房间到依赖的映射,因此没有正确的方法来生成您想要的结果。如果你想编写一个作业,那么你应该提出另一个问题,提供表格的布局和编制作业的规则。

答案 1 :(得分:0)

您需要一种方法来查看与BOOKINGROOM表关联的DEPENDENT表。 像BOOKINGDEPENDENT.ROOMID = BOOKINGROOM.ID之类的东西。然后像这样加入:

SELECT b.BOOKINGID,
       b.GUESTID,
       d.DEPENDANTID,
       d.FORENAME AS firstname,
       d.SURNAME AS lastname,
       br.FLOORNO,
       br.ROOMNO
FROM  BOOKING b
      LEFT JOIN BOOKINGDEPENDANT bd
      ON b.BOOKINGID = bd.BOOKINGID
      LEFT JOIN DEPENDANT d
      ON d.DEPENDANTID = bd.DEPENDANTID
      LEFT JOIN BOOKINGROOM br 
      ON br.ID = bd.ROOMID and ON br.BOOKINGID = b.BOOKINGID
WHERE b.BOOKINGID = &BOOKINGID;