不确定我的SQL JOIN是否为我的作业返回了正确的集合

时间:2012-06-24 20:04:52

标签: sql database oracle

我正在学习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排,那就是我应该回来的所有东西?我不认为这是可能的,因为同一本书存在于多个订单上。

1 个答案:

答案 0 :(得分:0)

您可能已经开始区分INNER JOINLEFT JOINLEFT 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