1

我正在尝试列出个别客人的家属。预订酒店时,客人可以带上朋友或孩子(家属)。但是,预订房间时,每间客房只能容纳 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 也是如此。

4

2 回答 2

1

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

让我假设你有一个房间 id BookingDependant。如果是这样,那么该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表中进行预订的单个人。

如果您没有每个受抚养人的 roomid,则从查询中删除房间:

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; 

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

于 2013-03-19T20:43:59.257 回答
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; 
于 2013-03-19T20:44:49.747 回答