1

我正在学习 JOINS 并需要以下问题的帮助:

在 BOOKS 表中显示所有书籍的列表。如果客户已经订购了一本书,还要列出订单号并说明客户的居住地。

这是我能做到的。甲骨文 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 行是从未订购过的书?我所拥有的是否有意义。我在想是因为 books 表只有 14 行,那我就应该返回?我认为这是不可能的,因为同一本书存在于多个订单上。

4

1 回答 1

0

您可能已经开始区分INNER JOIN,并且LEFT JOIN基于此LEFT JOIN不会过滤掉左侧任何不匹配的行。然而,这并不能阻止相反的情况发生。

如果您有多个具有相同 ISBN 的“订单项”(或者,不太可能的是具有相同 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
于 2012-06-24T20:27:37.500 回答