2016-02-26 1 views
0

Первый запрос, указанный ниже, возвращает некоторые логистические данные, связанные с наймами, которые были сделаны в течение определенного периода времени. Запрос возвращает 478 записей.CTE Missing Records

SELECT c.candidate_id AS candidate_id 
,o.name 
,j.name AS job_title 
,c.applied_from 
,job_id AS job_id 
,cjs.score AS smart_rank_score 
,cjs.is_completed AS smartrank_completion_status 
,c.hired_at 
FROM candidate_jobs c 
LEFT JOIN organizations o ON o.id = c.organization_id 
LEFT JOIN candidate_job_surveys cjs ON cjs.candidate_job_id = c.id 
LEFT JOIN jobs j ON j.id = c.job_id 
WHERE o.name LIKE ANY ('{"%Tutor Doctor%"}') 
AND c.hired_at :: date BETWEEN '2015-01-01' AND '2016-02-22' 
ORDER BY 8 DESC 

Однако, когда я попытался добавить КТР (смотри ниже), который отображает окончательный «после проверки проката в счете» каждого Hire, в запрос возвращает только 236 записей. В идеале я бы хотел, чтобы запрос возвращал оценку или нулевое значение для каждой из первых 478 записей о зачислении.

WITH final_post_hire_score (candidate_id, final_score) AS 
(SELECT c.candidate_id 
    ,p.score 
    FROM post_hire_followup_reviews p 
    LEFT JOIN candidate_jobs c ON c.id = p.candidate_job_id 
    WHERE p.check_in_number = 3) 

SELECT c.candidate_id AS candidate_id 
,o.name 
,j.name AS job_title 
,c.applied_from 
,job_id AS job_id 
,cjs.score AS smart_rank_score 
,cjs.is_completed AS smartrank_completion_status 
,c.hired_at 
,final_score 
FROM final_post_hire_score f 
LEFT JOIN candidate_jobs c ON c.candidate_id = f.candidate_id 
LEFT JOIN organizations o ON o.id = c.organization_id 
LEFT JOIN candidate_job_surveys cjs ON cjs.candidate_job_id = c.id 
LEFT JOIN jobs j ON j.id = c.job_id 
WHERE o.name LIKE ANY ('{"%Tutor Doctor%"}') 
AND c.hired_at :: date BETWEEN '2015-01-01' AND '2016-02-22' 
ORDER BY 8 DESC 

ответ

0

Пропущенные записи из-за фильтра, переместите фильтр, чтобы ON состоянии иначе ваш LEFT OUTER JOIN будет неявно преобразован в INNER JOIN

При использовании LEFT OUTER JOINтаблице справа фильтр должен присутствовать в ON состоянии иначе значения NULL для несоответствующих записей будут отфильтрованы

WITH final_post_hire_score (candidate_id, final_score) 
    AS (SELECT c.candidate_id, 
       p.score 
     FROM post_hire_followup_reviews p 
       LEFT JOIN candidate_jobs c 
         ON c.id = p.candidate_job_id 
     WHERE p.check_in_number = 3) 
SELECT c.candidate_id AS candidate_id, 
     o.NAME, 
     j.NAME   AS job_title, 
     c.applied_from, 
     job_id   AS job_id, 
     cjs.score  AS smart_rank_score, 
     cjs.is_completed AS smartrank_completion_status, 
     c.hired_at, 
     final_score 
FROM final_post_hire_score f 
     LEFT JOIN candidate_jobs c 
       ON c.candidate_id = f.candidate_id 
      AND c.hired_at :: date BETWEEN '2015-01-01' AND '2016-02-22' 
     LEFT JOIN organizations o 
       ON o.id = c.organization_id 
      AND o.NAME LIKE ANY ('{"%Tutor Doctor%"}') 
     LEFT JOIN candidate_job_surveys cjs 
       ON cjs.candidate_job_id = c.id 
     LEFT JOIN jobs j 
       ON j.id = c.job_id 
ORDER BY 8 DESC 
0

Я думаю, что есть дополнительные

WHERE p.check_in_number = 3 

Это не где-нибудь еще.

+0

Я имею в виду, что это в вашем CTE, но это не в исходном запросе. – kaisquared