Select SQL 服务器中 JOIN(2 个表)一本书的最高价格?

Select MAX price of a book with JOIN (2 tables) in SQL Server?

我有2张桌子

CREATE TABLE BOOKS 
(
    numbk INT PRIMARY KEY IDENTITY,
    nombk NVARCHAR(60),
    _numrub INT FOREIGN KEY REFERENCES CLASSIFICATION(numrub)
)

CREATE TABLE TARIFER 
(
     _numbk INT FOREIGN KEY REFERENCES BOOKS(numbk),
     _nomed NVARCHAR(60) FOREIGN KEY REFERENCES EDITEURS(nomed),
     _date DATE,
     price DECIMAL(20,2),

     PRIMARY KEY (_numouv, _nomed)
)

问题是:如何列出所有具有最高价格的书名 (nombk)?

PS:TRAFIER 有价格列,以及来自 BOOKS 的外键 _numbk

我试过这个:

select 
    o.nombk, max(prix) 
from 
    TARIFER tr, books o 
where 
    o.numbk = tr._numbk
group by
    o.nombk

这列出了所有,但是当我执行这个时:

select max(prix) 
from TARIFER tr, books o 
where o.numbk = tr._numbk

它returns只有最高价。我不知道为什么。有人可以解释一下吗?

在SQL服务器中,可以使用TOP (1) WITH TIES:

select top (1) with ties b.nombk, t.prix
from books b join
     TARIFER t
     on b.numbk = t._numbk
order by t.prix desc;

两个查询都聚合,但不在同一级别:

  • 第一个查询有 group by o.nombk,所以它为每本书生成一条记录,并为您提供这本书在所有 tarifers 中的最高价格。

  • 第二个查询没有 group by 子句,因此它为您提供了所有书籍的最高价格。

如果您想要价格较高的书,则无需聚合:您可以加入并按价格排序结果:

select top (1) with ties b.*, t.*
from books b 
inner join join tarifer t on b.numbk = t._numbk
order by t.prix desc;

top (1) with ties给你第一条记录;如果有几条记录具有相同的最高价格,则查询 returns 全部。

为什么不只使用一个子查询来获取 max(prix),然后使用该子查询列出具有该 prix 的所有记录:

select o.nombk ,prix 
from TARIFER tr , books o 
where o.numbk = tr._numbk
  and tr.prix in (select max(prix) from TARIFER tr)