2014-06-15 81 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);