Подзапрос вернул более одного значения. это не разрешено

Я пытаюсь извлечь данные из разных таблиц и пытаюсь получить golivedata на основе даты и идентификатора клиента. Ниже запрос.

select c.customerID,  
       c.CustomerName,  
       cs.ContactName, 
       e.ComponentName, 
       e.ComponentVersion, 
       (
           select ps.GoLiveDate  
           from   Projects ps 
           where  ps.GoLiveDate <= CURRENT_TIMESTAMP 
           and    ps.CustomerID = c.CustomerID
       ) as CurrentGoLiveDate 
from   projects p 
       join customers c    on c.CustomerID = p.CustomerID 
       join contacts cs    on cs.ProjectID = p.ProjectID 
       join Environments e on e.ProjectID  = p.ProjectID 
where  e.ComponentName like 'RP%' 
and    cs.ContactType = 'Account Manager'

Но я получаю сообщение об ошибке:

Подзапрос вернул более одного значения. это не разрешено

Вы пытаетесь получить GoLiveDate от клиента? Для клиента с несколькими проектами этот подзапрос будет возвращать несколько строк. Какой GoLiveDate вы хотите?

Squirrel 09.04.2019 04:38
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
317
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы используете результат своего подзапроса в качестве значения в своем окончательном выражении select. Поскольку запрос возвращает более одного значения, вы получаете ошибку. Если вы ожидаете более одного значения из подзапроса, вам следует разработать свой запрос по-другому.

Ответ принят как подходящий

Ваш подзапрос в операторе Select возвращает более одной записи.

WHERE ps.GoLiveDate <= CURRENT_TIMESTAMP AND ps.CustomerID = c.CustomerID

соответствует более чем одной строке. Вам нужно либо SELECT TOP 1, либо SELECT MIN/MAX и т. д.

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

Я думаю, что это также может помочь вам получить ожидаемый результат.

select c.customerID,  c.CustomerName,  cs.ContactName, e.ComponentName, e.ComponentVersion,
  ps.GoLiveDate as CurrentGoLiveDate 
 from projects p 
 join customers c on c.CustomerID = p.CustomerID 
 join contacts cs on cs.ProjectID = p.ProjectID
 join Environments e on e.ProjectID = p.ProjectID
  where e.ComponentName like 'RP%' and cs.ContactType= 'Account Manager' 
  and exists (select 1 from Projects ps where  ps.GoLiveDate <= CURRENT_TIMESTAMP and ps.CustomerID = c.CustomerID) 

Увидев, что на изображении, которое вы разместили, есть TOP 1. Я просто предполагаю, что вы хотели максимум GoLiveDate.

select c.customerID,  
       c.CustomerName,  
       cs.ContactName, 
       e.ComponentName, 
       e.ComponentVersion, 
       (
           select MAX(ps.GoLiveDate)   -- Added MAX() here
           from   Projects ps 
           where  ps.GoLiveDate <= CURRENT_TIMESTAMP 
           and    ps.CustomerID = c.CustomerID
       ) as CurrentGoLiveDate 
from   projects p 
       join customers c    on c.CustomerID = p.CustomerID 
       join contacts cs    on cs.ProjectID = p.ProjectID 
       join Environments e on e.ProjectID  = p.ProjectID 
where  e.ComponentName like 'RP%' 
and    cs.ContactType = 'Account Manager'

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

select c.customerID,  
       c.CustomerName,  
       cs.ContactName, 
       e.ComponentName, 
       e.ComponentVersion, 
       x.CurrentGoLiveDate
from   projects p 
       join customers c    on c.CustomerID = p.CustomerID 
       join contacts cs    on cs.ProjectID = p.ProjectID 
       join Environments e on e.ProjectID  = p.ProjectID 
       join (select ps.GoLiveDate  CurrentGoLiveDate, CustomerID
             from   Projects ps 
             where  ps.GoLiveDate <= CURRENT_TIMESTAMP ) as X on X.CustomerID = c.CustomerID
where  e.ComponentName like 'RP%' 
and    cs.ContactType = 'Account Manager'

в других случаях вы должны использовать TOP 1 или MAX/MIN

Другие вопросы по теме