2016-02-26 76 views
0

下面列出的第一個查詢返回與在特定時間段內進行的僱傭相關的一些物流數據。該查詢返回478條記錄。CTE缺少記錄

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 

然而,當我試圖加一個顯示每個租賃的最後「後出租檢查中分數」的CTE(見下文),查詢只返回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會當您使用LEFT OUTER JOIN右表過濾器的應該是存在於ON條件隱式轉換爲INNER JOIN

否則對於不匹配記錄的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