2013-03-19 66 views
1

我想列出一位客人的家屬。預訂酒店時,客人可攜帶朋友或小孩(家屬)。但是,預訂房間時,每間客房僅可容納3人。因此,如果一位客人帶着4人與他們,2家屬將留在102室,其他3在103室。但他們在同一預訂讓我們說預訂編號= 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

@MooHa .....您需要一種方法來查看與BOOKINGROOM表關聯的DEPENDENT表。像DEPENDENT.ROOMID = BOOKINGROOM.ID。然後LEFT JOIN BOOKINGROOM br ON d.ROOMID = br.ID – MikeTWebb 2013-03-19 20:37:29

+0

受撫養人是否不是所有與預定相關房間的居住者? – 2013-03-19 20:38:26

+0

一個人可以預訂2個單獨的房間,但在同一預訂ID下。但它將每個房間的每個人都關聯起來,所以人x和y都與房間102和房間103相關聯,儘管y只保留在103中。因此,它爲每個房間打印兩次受撫養人。 – MooHa 2013-03-19 20:42:36

回答

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; 
+0

@MooHa ....根據您的ER,由於受撫養人和房間之間沒有關係,因此您將在查詢中獲得重複的結果。 ER建議允許DEPENDENTS在房間之間進行交換。如果要約束依賴於一個房間,那麼你就需要ROOMID添加到BOOKINGDEPENDANT和這些映射在我的答案上面 – MikeTWebb 2013-03-19 21:07:52

+0

但要創建一個關係(菱形)和邏輯上是錯誤的實體之間的關係。 – MooHa 2013-03-19 21:49:42

1

需要家屬和房間之間的映射。您擁有的是從預訂到受撫養人的映射,以及從預訂到房間的單獨映射。

讓我假設你在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表。

如果don'thave的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; 

你沒有從房間到另一個相關的映射,所以產生的結果不正確的方式你要。如果你想完成一項任務,那麼你應該提出另一個問題,提供表格的佈局和完成任務的規則。

+0

我在BOOKINGDEPENDENT中沒有「房間ID」。 BookingDept(預訂ID {PK,FK},DependantID {PK,FK}) – MooHa 2013-03-19 20:51:00