Я получаю ОШИБКУ подзапрос должен вернуть только один столбец.Как мне это решить? - PullRequest
0 голосов
/ 26 сентября 2018
select count(distinct "WorkContracts"."SubstituteTeacher") as "Count", "Accounts"."FirstName", "Accounts"."LastName", "Candidates"."Confirmed", "Candidates"."FinalStatus"
from dbo."Accounts"
left join dbo."WorkContracts" on "Accounts"."ID" = "WorkContracts"."SubstituteTeacher" 
full outer join dbo."SubstituteTeacherPeriods" on "Accounts"."ID" = "SubstituteTeacherPeriods"."CreatedBy" 
full outer join dbo."Candidates" ON "Accounts"."ID" = "Candidates"."ModifiedBy" 
where "WorkContracts"."WorkContractType" != 3 
and "SubstituteTeacherPeriods"."StartTime" > TO_TIMESTAMP('2018-09-18 00:00:00', 'yyyy-MM-dd HH24:mi:ss') 
and "SubstituteTeacherPeriods"."EndTime" < TO_TIMESTAMP('2018-09-19 00:00:00', 'yyyy-MM-dd HH24:mi:ss') 
and "SubstituteTeacherPeriods"."Discriminator" = 'AvailabilityPeriod'
and "Candidates"."FinalStatus" = (select max("FinalStatus") from dbo."Candidates")
and "Candidates"."Confirmed"= (select max("Confirmed")"Confirmed", "SubstituteTeacher" from dbo."Candidates" group by "SubstituteTeacher")
group by "Accounts"."FirstName", "Accounts"."LastName", "Candidates"."FinalStatus", "Candidates"."Confirmed"

1 Ответ

0 голосов
/ 26 сентября 2018

Эта строка вызывает ошибку:

and "Candidates"."Confirmed" = (select max("Confirmed")"Confirmed", "SubstituteTeacher"
    from dbo."Candidates" group by "SubstituteTeacher")

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

AND "Candidates"."Confirmed" IN (SELECT MAX("Confirmed") FROM dbo."Candidates"
                                 GROUP BY "SubstituteTeacher")

Вот весь ваш запрос, исправленный с этой проблемой:

SELECT
    COUNT(DISTINCT wc.SubstituteTeacher) AS Count,
    a.FirstName,
    a.LastName,
    c.Confirmed,
    c.FinalStatus
FROM dbo.Accounts a
LEFT JOIN dbo.WorkContracts wc
    ON a.ID = wc.SubstituteTeacher
FULL OUTER JOIN dbo.SubstituteTeacherPeriods s
    ON a.ID = s.CreatedBy
FULL OUTER JOIN dbo.Candidates c
    ON a.ID = c.ModifiedBy
WHERE
    wc.WorkContractType != 3 AND
    s.StartTime >= '2018-09-18 00:00:00' AND s.EndTime < '2018-09-19 00:00:00' AND
    s.Discriminator = 'AvailabilityPeriod' AND
    c.FinalStatus = (SELECT MAX(FinalStatus) FROM dbo.Candidates) AND
    c.Confirmed IN (SELECT MAX(Confirmed) FROM dbo.Candidates
                             GROUP BY SubstituteTeacher)
GROUP BY
    a.FirstName,
    a.LastName,
    c.FinalStatus,
    c.Confirmed;

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

Если вы хотите, чтобы последняя запись для каждого учителя использовалась в столбце Confirmed, тогда мы можем использовать ROW_NUMBER:

WITH cte AS (
    SELECT
        COUNT(DISTINCT wc.SubstituteTeacher) AS Count,
        a.FirstName,
        a.LastName,
        c.Confirmed,
        c.FinalStatus,
        ROW_NUMBER() OVER (PARTITION BY a.FirstName, a.LastName ORDER BY Confirmed DESC) rn
    FROM dbo.Accounts a
    ...         -- the rest of the above query
)

SELECT
    Count,
    FirstName,
    LastName,
    Confirmed,
    FinalStatus
FROM cte
WHERE rn = 1;
...