Oracle中的嵌套子查询

时间:2014-06-15 06:35:18

标签: sql oracle subquery

我有一个嵌套的子查询,我似乎无法弄明白。这是问题所在:

"使用BOOK_AUTHOR和AUTHOR表进行最上层查询,创建一个将返回BOOKID的子查询,以及写过该书的作者的名字和姓氏( s)购买最多的。要成功完成此操作,您需要首先查找ORDER_ITEMS表中书籍(基于bookid)的最大总份数(基于数量)。这将在最底层的查询中完成。此查询的返回将用于与ORDER_ITEMS表中的BOOKID进行比较,该表在中间查询中出现的次数相同。然后,此查询的返回将用于与最顶层查询的表中与作者相关的BOOKID进行比较。 (提示:注意,您的解决方案需要GROUP BY和HAVING子句。)"

以下是我到目前为止的陈述:

SELECT ba.bookid, a.firstname, a.lastname
FROM book_author ba, author a
WHERE bookid =
(SELECT bookid, quantity
FROM order_items
WHERE quantity IN
    (SELECT bookid, SUM(quantity)
    FROM order_items
    GROUP BY bookid);

根据我的判断,底层查询是正确的。它返回一个图书ID列表,其中包含每个ID的总销售数量。

现在假设我正确地阅读了问题,中间查询应该从底部查询返回的列表中提取图书ID,该查询销售的副本数量最多。这就是我被困的地方。我知道我上面写的中间查询不起作用。当我尝试一起测试中间和底部查询时,我得到一个ORA-913错误(值太多)。

任何人都可以对我失踪的内容提供任何见解吗?

感谢。

2 个答案:

答案 0 :(得分:1)

<强>问题:

您不能对子查询使用=(除非它只返回一个值)。

<强>解决方案:

在这种情况下,请使用IN。您应该使用MAX来查找最大值。

SELECT ba.bookid, a.firstname, a.lastname
FROM book_author ba, author a
WHERE bookid IN
(SELECT bookid
FROM order_items
WHERE quantity IN
    (SELECT MAX(quantity) as quantity
    FROM order_items
    GROUP BY bookid);

答案 1 :(得分:0)

由于您没有添加架构,我不得不即兴创建一些字段名称,但描述是在讨论类似于此的查询。请注意,MAX(SUM())可能不适用于所有RDBMS,但适用于Oracle。

SELECT ba.bookid, a.firstname, a.lastname
FROM book_author ba
JOIN author a ON a.id = ba.authorid
WHERE bookid IN
  (SELECT bookid
   FROM order_items
   GROUP BY bookid
   HAVING SUM(quantity) = 
     (SELECT MAX(SUM(quantity))
      FROM order_items
      GROUP BY bookid));

第一个(最底部)查询选择畅销书销售的书籍数量(即所有书籍的所有数量总和,并选择最大数量)

第二个(中间)查询选择所有销售量最高的书籍(可能是平局,因此我们可能会得到几个)

最后(最顶层)查询只选择这些书籍的书籍ID和作者详细信息。

An SQLfiddle to test with