[英]Condition excludes rows from query with LEFT JOIN
我有一個聲明,我試圖用來檢索完整的員工列表,然后是他們的假期。 即使他們沒有假期,我也想留住員工。 這是我到目前為止的發言;
SELECT emp.em_pplid, emp.em_name
FROM employs emp
LEFT JOIN people ppl ON emp.em_pplid = ppl.pp_id
LEFT JOIN empwork ew ON emp.em_pplid = ew.ew_pplid
WHERE emp.em_deptid = ?
AND ppl.pp_employee = ?
AND emp.em_type < ?
AND ew.ew_from > ?
ORDER BY emp.em_name"
這是AND ew.ew_from = ?
這將刪除沒有存儲在empwork
表中的假期的員工。 即使在empwork
表中沒有假期,如何讓員工表中的所有人員都擁有我想要的部門ID?
您的where
子句將left join
轉換為inner join
。 將條件放入聯接的on
子句中。
SELECT emp.em_pplid, emp.em_name
FROM employs emp
LEFT JOIN people ppl ON emp.em_pplid = ppl.pp_id
LEFT JOIN empwork ew ON emp.em_pplid = ew.ew_pplid
AND ew.ew_from > ?
WHERE emp.em_deptid = ?
AND emp.em_type < ?
AND (ppl.pp_employee IS NULL OR ppl.pp_employee = ?)
ORDER BY emp.em_name
應該僅在ON
子句內指定LEFT JOIN
右表上的條件。 如果不是,則由於NULL
比較,連接會自動轉換為INNER JOIN
:
SELECT emp.em_pplid, emp.em_name
FROM employs emp
LEFT JOIN people ppl
ON emp.em_pplid = ppl.pp_id AND ppl.pp_employee = ?
LEFT JOIN empwork ew
ON emp.em_pplid = ew.ew_pplid AND ew.ew_from > ?
WHERE emp.em_deptid = ?
AND emp.em_type < ?
ORDER BY emp.em_name"
如果我理解這個問題,這可能有效:
SELECT emp.em_pplid, emp.em_name
FROM employs emp
LEFT JOIN people ppl ON emp.em_pplid = ppl.pp_id
LEFT JOIN empwork ew ON emp.em_pplid = ew.ew_pplid
WHERE emp.em_deptid = ?
AND ppl.pp_employee = ?
AND emp.em_type < ?
AND (ew.ew_from > ? OR ew.ew_from IS NULL)
ORDER BY emp.em_name"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.