Я получаю "Скалярный подзапрос содержит более одной строки" для следующего запроса, который я написал. Может кто-нибудь исправить меня? - PullRequest
0 голосов
/ 19 апреля 2019

Две таблицы

  1. клиент (id, имя, страна)

customer table

  1. покупка (id, customer_id, год)

PURCHASE Table

Я бы хотел увидеть следующие 3 вещи

идентификатор каждого клиента (переименовать столбец cus_id),
имя каждого клиента (переименуйте столбец в cus_name)
идентификатор покупки последней покупки (переименуйте столбец latest_purchase_id)

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

Мой код:

select customer.id as cus_id,customer.name as cus_name,purchase.id as latest_purchase_id
from customer
 join purchase
 on customer.id=purchase.customer_id
 where purchase.id=(select id
from purchase p1
where year = ( select max(year)
              from purchase p2
              where p1.customer_id=p2.customer_id))
         ;

образец вывода

cus_id cus_name latest_purchase_id
1      John        786F

Я получаю скалярный подзапрос, получающий более одной ошибки строки.

Ответы [ 3 ]

1 голос
/ 19 апреля 2019

Это ваша проблема:

select c.id as cus_id, c.name as cus_name, p.id as latest_purchase_id
from customer c join
     purchase p
     on c.id = p.customer_id
where p.id = (select p2.id
-----------^
              from purchase p2
              where p2.year = (select max(p3.year)
                               from purchase p3
                               where p2.customer_id = p3.customer_id
                              )
            );

Чтобы исправить эту проблему, измените = на in.Тем не менее, без описания того, что вы делаете, я не могу сказать, делает ли это что-нибудь полезное.

Если вам нужна последняя покупка для каждого покупателя, я думаю о чем-то вроде этого:

select c.id as cus_id, c.name as cus_name, p.id as latest_purchase_id
from customer c join
     purchase p
     on c.id = p.customer_id join
     (select p2.customer_id, max(p2.year) as max_year
      from purchase p2
      group by p2.customer_id
     ) p2
     on p2.customer_id = p.customer_id and
        p2.max_year = p.year;
0 голосов
/ 19 апреля 2019

скалярный подзапрос получает более одной строки

Это означает, что (select id from purchase p1 ...) возвращает более одной строки.И хорошо ... вы не можете использовать равные (=) для нескольких строк.

У вас есть два варианта:

  1. Вы должны убедиться,он возвращает одну строку, возможно, используя функцию MAX() (или другую), например:

    where purchase.id = (select MAX(id)
      from purchase p1 ...
    
  2. Используйте оператор агрегатора (например, ANY).Например:

    where purchase.id = ANY (select id
      from purchase p1 ...
    
0 голосов
/ 19 апреля 2019

Вы можете попробовать ниже -

select customer.id as cus_id,customer.name as cus_name,purchase.id as 
latest_purchase_id
from customer join purchase p1 on customer.id=p1.customer_id
where year = 
( select max(year) from purchase p2
              where p1.customer_id=p2.customer_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...