【问题标题】:Advice needed on SQL QueryingSQL查询所需的建议
【发布时间】:2013-04-27 13:35:01
【问题描述】:

我正在准备几周后的考试,遇到了一个我仍然无法弄清楚的 SQL 查询问题。我想知道是否有人可以给我建议。

关系数据库:

Books(**ISBN**, Title, Genre, Price, Publisher, PublicationYear)

Author(**AuthorNum**, Name)

Write(**ISBN**, AuthorNum)

问题:找出每个出版商最贵的书,连同作者姓名,按书名字母顺序排列。

我尝试了很多方法,我认为这是最接近解决方案的一种,但它不正确:

SELECT Title, Name
FROM Author AS a, Books AS b, Write AS w
WHERE a.AuthorNum = w.AuthorNum AND b.ISBN = w.ISBN
GROUP BY Publisher
HAVING MAX(Price)
ORDER BY Title

【问题讨论】:

  • 您使用的是哪种 SQL 变体? (或者这个类是否仅限于标准 - 如果是,是哪一个?)
  • 出现平局时应该如何处理:当出版商的两本(或更多)书的最高价格相同时?
  • 该问题是过去的纸质考试问题,它没有指定在这种情况下该怎么做,但很好的评论。我想这个价格的书都应该退了吗?
  • 整个想法是您可以以这样一种方式构建您的查询,它可以被采用来支持这两个选项。如果您的 DBMS 支持,最干净/最简单的方法是使用分析函数(row_number() 与 rank())。 stackoverflow.com/q/16119906/905902
  • @ConnorMcGuile "..连同作者的名字.." 这里的问题是没有任何迹象表明这本书只有一位作者。事实上,表格的设计特别暗示了一些书籍有多个作者。

标签: sql


【解决方案1】:

内联视图通常在各种数据库上表现良好。不要过早优化。

您可以获得每个发布商的最高价格:

1

    select publisher, max(price) as MaxPublisherPrice
    from books
    group by publisher

您可以通过加入上述语句返回的集合来找出每个出版商的哪些书籍的价格等于 MaxPublisherPrice,如下所示:

2

    select books.title, P.MaxPublisherPrice as bookprice
    from books
    inner join
    (
      select publisher, max(price) as MaxPublisherPrice
      from books
      group by publisher
    ) as P
    on books.publisher = P.publisher
    and books.price = P.maxpublisherprice

然后您可以输入作者姓名:

3

    select books.title, P.MaxPublisherPrice as bookprice, author.name
    from books
    inner join
    (
      select publisher, max(price) as MaxPublisherPrice
      from books
      group by publisher
    ) as P
    on books.publisher = P.publisher
    and books.price = P.maxpublisherprice
    inner join write
    on write.isbn = books.isbn
    inner join author 
    on write.authornum = author.authornum
    order by books.title

【讨论】:

  • 作者表的最后一次连接是通过 write.authornum,而不是 books.authornum ;)
  • +1:很好地解释了满足要求的进展/演变。
  • 我喜欢这个解释。你能告诉我你更喜欢什么方法而不是 RBarryYoung 给出的方法,甚至是差异吗?据我所知,两者都很相似。
  • 您必须针对真实数据集运行它们并自行决定。在测试我的时候,我会推荐一个关于 (publisher,price) 的综合指数。
【解决方案2】:

我会这样做:

SELECT  b.Title, b.Name, b.Publisher, a.Author

FROM        Books  b
LEFT JOIN   Write  w    ON w.ISBN       = b.ISBN
INNER JOIN  Author a    ON a.AuthorNum  = w.AuthorNum  

WHERE   b.Price = (SELECT MAX(bb.Price) FROM Books bb
                   WHERE b.Publisher = bb.Publisher)

ORDER BY Title
;

注意一些细节:

  1. 仅使用标准 SQL 语法,不使用特定于供应商的语法或不推荐使用的语法
  2. 考虑到多本书可能从一个出版商处获得最高价格的可能性
  3. 适应书籍可能有多个作者的可能性
  4. 考虑到一本书可能没有任何已知作者
  5. 避免不必要地使用 GROUP BY,研究表明这可能比连接或子查询慢

【讨论】:

  • 我非常喜欢这个解决方案。我根本没想过要使用联接。最上面一行应该是“SELECT b.Title, b.Publisher, a.Name”,但我很容易意识到这一点。
  • 我已经更正了。而连接通常是解决 SQL 中可能存在的基数问题的最佳方式。
【解决方案3】:

您需要根据图书作者的出版商、书名和姓名进行分组。不仅仅是出版商。

分组允许拆分(或分解)行。 (因为您订购的是价格,所以最高价格是没有用的)

我不会在这里写查询因为我不会做你的作业:D :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多