Я пытаюсь извлечь данные из разных таблиц и пытаюсь получить 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'
Но я получаю сообщение об ошибке:
Вы используете результат своего подзапроса в качестве значения в своем окончательном выражении 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
Вы пытаетесь получить
GoLiveDate
от клиента? Для клиента с несколькими проектами этот подзапрос будет возвращать несколько строк. КакойGoLiveDate
вы хотите?