Выберите максимальное значение вместе с соответствующим названием? - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть две таблицы, которые были созданы и заполнены следующим образом:

create table booklist(title varchar(20), bookid char(2) PRIMARY KEY);
create table numberofcopies (bookid char(2) FOREIGN KEY REFERENCES booklist(bookid), numcopies int);

insert into booklist VALUES ('book 1', 1), ('book 2', 2);
insert into numberofcopies VALUES (1, 5), (2, 10);

Я пытаюсь получить максимальное значение, в данном случае '10' из id#2, затем произнесите его соответствующее название «книга 2». Вместо этого мой запрос возвращает список всех книг, а не просто книгу с максимальным значением. Как бы я go об этом? Мой SQL запрос пока:

SELECT MAX(numCopies), title AS Title
FROM numberofcopies JOIN booklist ON numberofcopies.bookid=booklist.bookid
GROUP BY Title;

Ответы [ 2 ]

2 голосов
/ 12 апреля 2020

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

select top (1) bl.*, noc.numcopies
from booklist bl
inner join numberofcopies noc on noc.bookid = bl.bookid
order by noc.numcopies desc

Если вы хотите разрешить верхние связи, вы можете использовать top (1) with ties вместо.


Редактировать : если вы делаете хотите max(), один из подходов - присоединиться, а затем отфильтровать с помощью коррелированного подзапроса, который получает максимум numcopies из numberofcopies.

select bl.*, noc.numberofcopies
from booklist bl
inner join numberofcopies noc on noc.bookid = bl.bookid
where noc.numcopies = (select max(numcopies) from numberofcopies)

Обратите внимание, что для этого требуется еще одно сканирование на numberofcopies, так что это действительно менее эффективно, чем первое решение.

0 голосов
/ 12 апреля 2020

Вы можете добавить после GROUP BY предложение:

ORDER BY numCopies DESC
LIMIT 1;

Запрос будет упорядочивать значения от самого большого до самого низкого. Ограничив 1 результатом, вы получите значение MAX.

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