Как сделать так, чтобы в моем запросе не возникала ошибка «подзапрос возвращает одну строку» - PullRequest
0 голосов
/ 15 октября 2018

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

SELECT title
FROM books JOIN orderitems
USING (isbn) WHERE isbn=
    (SELECT isbn
    FROM orderitems
    HAVING SUM (quantity) =
        (SELECT MAX(SUM(quantity))
        FROM orderitems
        GROUP BY isbn)
    GROUP BY isbn)
GROUP BY title;

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Использовать оконные функции!

SELECT title
FROM (SELECT isbn, title, SUM(quantity) as quantity,
             RANK() OVER (ORDER BY SUM(quantity) DESC) as seqnum
      FROM books b JOIN
           orderitems oi
           USING (isbn)
      GROUP BY isbn, title
     ) t
WHERE seqnum = 1;
0 голосов
/ 15 октября 2018

Вы хотите ранжировать книги по количеству заказов и показывать только те книги, которые имеют самый высокий рейтинг (ранг №1 для наибольшего количества).Есть функция окна RANK для ранжирования строк.

Вы хотите выбрать только название книги, поэтому выберите название из книг и примените свои критерии в предложении WHERE.

select title
from books
where (isbn, 1) in -- ISBN ranked #1
(
  select isbn, rank() over (order by sum(quantity) desc)
  from orderitems
  group by isbn
);
0 голосов
/ 15 октября 2018

ваш подзапрос возвращает несколько строк, которые не поддерживают = оператор, поэтому я использовал in

SELECT title
FROM books JOIN orderitems
USING (isbn) WHERE isbn in
    (SELECT isbn
    FROM orderitems
    group by isbn
    HAVING SUM (quantity) =
        (SELECT MAX(SUM(quantity))
        FROM orderitems
        GROUP BY isbn
        )
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...