2011-02-11 2 views
3

Вот запрос:Где предложение в левом соединении с использованием коррелированного запроса?

SELECT c.Name As CompanyName, j.ID as JobID, j.Title as JobTitle, 
ja.ApplicationDate, DATEDIFF(MONTH,ja.ApplicationDate, GETDATE()) AS MonthsAgo, 
jsc.Name As Recruiter, js.Name As RecruitingAgency, jsh.Name As LastStatus 
FROM Companies c 
JOIN Jobs j 
ON c.ID = j.CompanyID 
JOIN JobApplications ja 
ON j.ID = ja.JobID 
LEFT JOIN JobContact jsc 
ON jsc.ID = j.JobSourceContactID 
LEFT JOIN JobContactCompany js 
ON jsc.JobSourceCompanyID = js.ID 
LEFT JOIN (
    SELECT TOP 1 jh.JobID, jh.StatusDate, jt.Name 
    FROM JobStatusHistory jh 
    JOIN JobStatusTypes jt 
    ON jh.JobStatusTypeID = jt.ID 
    --WHERE jh.JobID = j.ID 
    ORDER BY jh.StatusDate DESC 
    ) jsh 
ON j.ID = jsh.JobID 
ORDER BY ja.ApplicationDate 

Я пытаюсь получить самый последний статус задания для выполнения конкретной работы. Я не могу понять, как сделать предложение where (комментарий WHERE) в LEFT JOIN. Я делал это в прошлом, но не помню, как я это делал в прошлом.

Буду признателен за любые указатели.

ответ

5

Вам необходимо использовать OUTER APPLY. Приложение CROSS применяется как INNER JOIN, где прикладная таблица должна возвращать результаты, тогда как OUTER Apply похож на [LEFT] OUTER JOIN, где прикладной подзапрос не может возвращать результаты.

SELECT c.Name As CompanyName, j.ID as JobID, j.Title as JobTitle, 
    ja.ApplicationDate, DATEDIFF(MONTH,ja.ApplicationDate, GETDATE()) AS MonthsAgo, 
    jsc.Name As Recruiter, js.Name As RecruitingAgency, jsh.Name As LastStatus 
FROM Companies c 
JOIN Jobs j ON c.ID = j.CompanyID 
JOIN JobApplications ja ON j.ID = ja.JobID 
LEFT JOIN JobContact jsc ON jsc.ID = j.JobSourceContactID 
LEFT JOIN JobContactCompany js ON jsc.JobSourceCompanyID = js.ID 
OUTER APPLY ( 
    SELECT TOP 1 jh.JobID, jh.StatusDate, jt.Name 
    FROM JobStatusHistory jh 
    JOIN JobStatusTypes jt 
    ON jh.JobStatusTypeID = jt.ID 
    WHERE jh.JobID = j.ID 
    ORDER BY jh.StatusDate DESC 
    ) jsh 
ORDER BY ja.ApplicationDate 
+1

Не знал, что был оператор APPLY. Узнал что-то новое сегодня! –

Смежные вопросы