讓我們考慮一個玩具示例。有一個表員工和表任務,其中每個任務分配給一個員工。一名員工可以有多項任務。
我想查詢員工按任務中的某些列過濾他們。我將員工分組以只顯示一次。查詢將是這樣的:
SELECT *
FROM employees emp JOIN tasks tsk on emp.id = tsk.assigned_emp
WHERE tsk.deadline = today
GROUP BY employees
這作業正常,但現在假設我想選擇沒有任何截止日期今天到期的任務的員工。我的第一次嘗試是:
tsk.deadline != today
但隨后是找到至少有一項今天沒有到期的任務的員工。如何撰寫查詢以包含給定員工的所有可能任務?
uj5u.com熱心網友回復:
對于這個反連接任務,有幾種不同的解決方案。其中之一正在使用NOT EXISTS
SELECT *
FROM employee e
WHERE NOT EXISTS(
SELECT 1
FROM tasks t
WHERE e.id = t.assigned_emp and t.deadline = today
)
uj5u.com熱心網友回復:
你想要這個LEFT JOIN ... IS NULL模式。
SELECT *
FROM employees emp
LEFT JOIN tasks tsk ON emp.id = tsk.assigned_emp
AND tsk.deadline = today
WHERE tsk.deadline IS NULL
GROUP BY employees
JOIN從其第一個表中洗掉與您的 ON 條件不匹配的行。相比之下,LEFT JOIN將它們留在原地,將 NULL 值放入第二個表的結果列中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/377389.html
上一篇:重命名sql表中的欄位的問題
