2015-04-06 84 views
0

我遇到问题,只能使用子查询。我找到了已售出最多的书的作者姓名。如果只有一行匹配totalsold的MAX值,那么我的工作原理就是如此。ORACLE sql:返回与SUM值相关的子查询的MAX值相关的列

SELECT fname, lname 
FROM Books b 
JOIN BookAuthor ba ON b.isbn = ba.isbn 
JOIN Author a ON ba.authorid = a.authorid 
WHERE b.isbn = 
    (SELECT isbn 
    FROM 
     (SELECT SUM(quantity) as totalsold, ba.isbn as isbn 
      FROM BookAuthor ba 
      JOIN Author a ON ba.authorid = a.authorid 
      JOIN OrderItems oi ON ba.isbn = oi.isbn 
      GROUP BY ba.isbn 
      ORDER BY totalsold DESC) 
    WHERE rownum = 1) 

然而,在理论上有可能是最高值的领带,我停留在如何返回相关的ISBN绑在MAX值(S)。

在本质上是如何做到这一点查询,而无需使用WHERE ROWNUM = 1

我想出了这一点,但似乎比笨重,但它的工作原理:

SELECT fname, lname 
FROM Books b 
JOIN BookAuthor ba ON b.isbn = ba.isbn 
JOIN Author a ON ba.authorid = a.authorid 
WHERE b.isbn IN 
    (SELECT ISBN 
    FROM 
     (SELECT SUM(quantity) as totalsold, ba.isbn as isbn 
     FROM BookAuthor ba 
     JOIN Author a ON ba.authorid = a.authorid 
     JOIN OrderItems oi ON ba.isbn = oi.isbn 
     GROUP BY ba.isbn) 
    WHERE totalsold = 
     (SELECT MAX(totalsold) 
     FROM 
      (SELECT SUM(quantity) as totalsold, ba.isbn as isbn 
      FROM BookAuthor ba 
      JOIN Author a ON ba.authorid = a.authorid 
      JOIN OrderItems oi ON ba.isbn = oi.isbn 
      GROUP BY ba.isbn))) 
+0

您并不需要在子查询中执行所有这些连接。检查我更新的答案。 – 2015-04-06 01:08:26

+0

您允许使用分析功能吗? – 2015-04-06 01:31:39

回答

0

你的解决方案是错误的。

  1. 您需要先找到一个数字,表示最大销售量的书籍。这个 查询将返回一个数字。说$ MAXNUMBER
  2. 然后,你需要通过步骤书籍加盟找到所有书籍,在那里出售相同数量为$ MAXNUMBER
  3. 这时你会发现作者2

我给你的子查询返回给你一套已售出最多版本的图书。

SELECT 
    oi2.isbn 
FROM 
    OrderItems oi2 
WHERE 
    SUM(oi2.quantity) = (SELECT MAX(st.sumtotal) as total FROM (SELECT 
      SUM(oi.quantity) AS sumtotal 
     FROM 
      OrderItems oi 
     GROUP BY oi.isbn) st) GROUP BY oi2.isbn 

现在您可以加入它或将它用作IN(子查询)函数的子查询。您还需要执行GROUP BY author_id,因为作者可以拥有两本出售相同最大副本的书籍。

根据最终要求,如果您只需要作者姓名或作者姓名与书籍名称,则需要构建不同的查询。

+0

不要认为使用'IN'和'='的值有所不同我更关心使用'rownum = 1',因为无论如何这只会返回一个值。 – 2015-04-06 00:41:30

+0

您的解决方案从开始就是错误的。我会编辑我的答案... – 2015-04-06 00:42:16