我正在尝试列出某位客人的家属。预订酒店时,客人可携带朋友或孩子(家属)。但是,预订客房时,每间客房仅可容纳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.
答案 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;