我有一个嵌套的子查询,我似乎无法弄明白。这是问题所在:
"使用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错误(值太多)。
任何人都可以对我失踪的内容提供任何见解吗?
感谢。
答案 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和作者详细信息。