Подзапрос вернул более одного значения. это не разрешено - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь получить данные из разных таблиц и пытаюсь получить 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'

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

error image

Ответы [ 5 ]

0 голосов
/ 09 апреля 2019

если вы не беспокоитесь о двойном клиенте, вы можете использовать это:

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

0 голосов
/ 09 апреля 2019

Видя, что на изображении, которое вы разместили, есть 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'
0 голосов
/ 09 апреля 2019

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

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

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

0 голосов
/ 09 апреля 2019

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

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

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) 
0 голосов
/ 09 апреля 2019

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

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