我正在学习JOINS并需要以下问题的帮助:
显示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排,那就是我应该回来的所有东西?我不认为这是可能的,因为同一本书存在于多个订单上。
答案 0 :(得分:0)
您可能已经开始区分INNER JOIN
和LEFT JOIN
,LEFT JOIN
不会过滤掉左侧任何不匹配的行。然而,这并不能阻止相反的情况发生。
如果您有多个具有相同ISBN的“orderitems”(或者,不太可能,具有相同ORDER#的多个订单,或具有相同CUSTOMER#的多个客户),则每个此类匹配将在您的情况下复制相应的左侧行“书籍”。
您可以像这样显示违规书籍:
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