2014-06-15 42 views
0

我有一个嵌套子查询,我似乎无法弄清楚。这里是问题:在Oracle中嵌套子查询

“使用BOOK_AUTHOR和AUTHOR表作为最上面的查询,创建一个子查询,它将返回BOOKID,以及写作该书的作者的姓氏和名字(为了成功完成这项工作,您需要首先找出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

更改'WHERE bookid ='到'WHERE bookid in'并从子查询中删除bookid –

回答

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)); 

第一个(最底层)的查询选择最佳畅销书多少书已经销售(即所有的数量为所有书籍的总和,随便挑最大数量)

第二(中)查询选择已售出最高数量的所有书籍(可能是领带,因此我们可能会得到几个)的bookid's

最后(最上面的)查询只是为这些书选择书籍ID和作者详细信息。

An SQLfiddle to test with

+0

.....谢谢。 – tworley1977

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);