Подзапрос возвращает несколько строк в предложении HAVING - PullRequest
0 голосов
/ 14 ноября 2018

Я хочу получить клиента, который в основном заимствовал фильмы категории 3 в 2016 году, июль

SELECT c_firstName, c_lastName, rental.c_ID
FROM customer, rental
GROUP BY rental.c_ID HAVING rental.c_ID=MAX((SELECT COUNT(rental.c_ID) 
FROM customer, copies, rentalprocess, rental, film
WHERE customer.c_ID=rental.c_ID AND rentalprocess.r_ID=rental.r_ID AND
      rentalprocess.s_ID=copies.s_ID AND film.f_ID=copies.f_ID AND
      f_category=3 AND r_date LIKE "2016-07%" GROUP BY rental.c_ID))

Но он не работает, поскольку он сказал, что подзапрос возвращает более одной строки

Что я могу сделать?

Ответы [ 2 ]

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

ваш код должен выглядеть примерно так, правильно соединяйте таблицы в коде. Я не знаю, какие столбцы и таблица лучше всего подойдут для решения, потому что я не получил вашу полную схему. но это должно дать более быстрый запрос. Поместите больше столбцов в выбор, если хотите.

select c_firstName | ' ' | c_lastName, count(rental.c_ID) as rentalCustomer
    from customer
     inner join rental
       on join " connect the both tables"
      innner join rentalprocess
       on "connect rental with rentalprocess"
      inner join copies
         on " connect rentalprocess with copies"
       inner join film
        on "connect copies with film"
    WHERE customer.c_ID=rental.c_ID AND 
    rentalprocess.r_ID=rental.r_ID AND
      rentalprocess.s_ID=copies.s_ID AND 
    film.f_ID=copies.f_ID AND
      f_category=3 AND r_date LIKE "2016-07%"
     group by c_firstName, c_lastName, rental.c_ID
    order by rental.c_ID desc;
0 голосов
/ 14 ноября 2018

Max() - агрегатная функция, которая должна быть в операторе выбора

SELECT 
  c_firstName
  , c_lastName
  , rental.c_ID
FROM customer, rental
GROUP BY rental.c_ID 
HAVING rental.c_ID=
  (
  select 
    MAX(i.iID) 
  from 
    (
    SELECT 
      COUNT(rental.c_ID) iID
    FROM customer, copies, rentalprocess, rental, film
    WHERE 
      customer.c_ID=rental.c_ID AND 
      rentalprocess.r_ID=rental.r_ID AND
      rentalprocess.s_ID=copies.s_ID AND 
      film.f_ID=copies.f_ID AND
      f_category=3 
      AND r_date LIKE "2016-07%" 
    GROUP BY rental.c_ID
    ) i
  )

В этом случае суб-выбор возвращает несколько строк, но затем вы берете максимальное значение этого запроса

Комментарий г-на Линоффа верен, вы должны использовать соединения Explicity:

SELECT 
  c_firstName
  , c_lastName
  , rental.c_ID
FROM customer, rental
GROUP BY rental.c_ID 
HAVING rental.c_ID=
  (
  select 
    MAX(i.iID) 
  from 
    (
    SELECT 
      COUNT(rental.c_ID) iID
    FROM 
      customer 
      inner join rental 
        on customer.c_ID=rental.c_ID
      inner join rentalprocess 
        on rentalprocess.r_ID=rental.r_ID
      inner join copies 
        on rentalprocess.s_ID=copies.s_ID
      inner join film on film.f_ID=copies.f_ID
    WHERE 
      f_category=3 
      AND r_date LIKE "2016-07%" 
    GROUP BY rental.c_ID
    ) i
  )
...