Выбрать максимальную цену книги с JOIN (2 таблицы) в SQL Server? - PullRequest
0 голосов
/ 28 октября 2019

У меня есть 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

Возвращает только максимальную цену. Я не знаю почему. Может кто-нибудь объяснить, пожалуйста?

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

В SQL Server вы можете использовать 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;
1 голос
/ 28 октября 2019

Почему бы не использовать только подзапрос, чтобы получить максимум (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)
1 голос
/ 28 октября 2019

Оба запроса к агрегации, но не на одном уровне:

  • Первый запрос имеет group by o.nombk, поэтому он генерирует одну запись на книгу и дает максимальную ценуэта книга распространяется на все тарифы.

  • Во втором запросе нет группировки по группам, следовательно, он дает максимальную цену всех книг по всем тарифам.

Если вы хотите книгу с более высокой ценой, вам не нужно агрегировать: вы можете объединять и сортировать результаты по цене:

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 дает первую запись;если существует несколько записей с одинаковой верхней ценой, запрос возвращает их все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...