1

我正在准备几周后的考试,遇到了一个我仍然无法弄清楚的 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
4

3 回答 3

4

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

您可以获得每个发布者的最高价格,因此:

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
于 2013-04-27T14:06:44.707 回答
1

我会这样做:

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,研究表明这可能比连接或子查询慢
于 2013-04-27T14:31:28.987 回答
0

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

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

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

于 2013-04-27T13:38:39.120 回答