2012-06-24 47 views
1

我瞭解連接和需要以下問題有所幫助:不知道我的SQL JOIN將返回正確設置爲我的任務

顯示在BOOKS表中的所有書籍的列表。如果客戶訂購的書籍爲 ,則還列出訂單號碼並指明 客戶所在的國家/地區。

這就是我所能做的。 Oracle 11g。

SELECT B.TITLE, O.ORDER#, C.STATE FROM BOOKS B 
    LEFT OUTER JOIN ORDERITEMS OI ON B.ISBN = OI.ISBN 
    LEFT OUTER JOIN ORDERS O ON O.ORDER# = OI.ORDER# 
    LEFT OUTER JOIN CUSTOMERS C ON C.CUSTOMER# = O.CUSTOMER#; 

這個查詢給了我35行的結果。我的BOOKS表只有14行。我的ORDERITEMS表有32行。我假設3個額外的行是從未訂購的書籍?我甚至有意義嗎?我在想,因爲書桌只有14行,那麼這就是我應該回來的?我不認爲這是可能的,因爲同一本書存在多個訂單。

+1

您的查詢和解釋似乎是正確的。你有什麼問題? – Andomar

+1

也許3個額外的行是由多個客戶訂購的書籍。 '命令由BTITLE'看到他們堆疊在一起。您的查詢看起來對我來說正確。 –

+1

是的,我期望看到每行訂單,額外的行從未訂購的書籍。我認爲你的查詢是正確的。這個問題並沒有真正解決如何處理同一本書的多個訂單。 – Blorgbeard

回答

0

您可能已經開始區分INNER JOINLEFT JOIN,因爲LEFT JOIN不會過濾掉左側的任何不匹配的行。但是,這並不能阻止相反的情況發生。

如果您有多個「的OrderItems」與同一ISBN(或者,不太可能,多單以相同的訂單編號,或多個客戶與同一客戶#),然後這樣的比賽將複製相應的左手邊的一排,「書」在你的情況。

可以顯示違規的書是這樣的:

SELECT B.TITLE, B.ISBN, COUNT(*) FROM BOOKS B 
LEFT OUTER JOIN ORDERITEMS OI ON B.ISBN = OI.ISBN 
GROUP BY B.ISBN, B.TITLE 
HAVING COUNT(*) > 1 
相關問題