SQL 查询加入的所有分组记录 table
SQL query for all grouped records in joined table
让我们考虑一个玩具示例。有 table 名员工和 table 项任务,其中每个任务分配给一名员工。一名员工可以有多项任务。
我想查询按任务中某些列筛选的员工。我将员工分组,每个员工只显示一次。查询将是这样的:
SELECT *
FROM employees emp JOIN tasks tsk on emp.id = tsk.assigned_emp
WHERE tsk.deadline = today
GROUP BY employees
这很好用,但现在假设我想 select 没有 any 任务的员工今天截止日期。我的第一次尝试是:
tsk.deadline != today
但随后发现员工至少有一项今天未到期的任务。如何编写查询以包含给定员工的 所有 可能任务?
您需要 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
从第一个 table 中删除与您的 ON 条件不匹配的行。相比之下,LEFT JOIN
将它们留在原地,将 NULL 值放入第二个 table.
的结果列中
这个反加入任务有几种不同的解决方案。其中之一是使用 NOT EXISTS
SELECT *
FROM employee e
WHERE NOT EXISTS(
SELECT 1
FROM tasks t
WHERE e.id = t.assigned_emp and t.deadline = today
)
让我们考虑一个玩具示例。有 table 名员工和 table 项任务,其中每个任务分配给一名员工。一名员工可以有多项任务。
我想查询按任务中某些列筛选的员工。我将员工分组,每个员工只显示一次。查询将是这样的:
SELECT *
FROM employees emp JOIN tasks tsk on emp.id = tsk.assigned_emp
WHERE tsk.deadline = today
GROUP BY employees
这很好用,但现在假设我想 select 没有 any 任务的员工今天截止日期。我的第一次尝试是:
tsk.deadline != today
但随后发现员工至少有一项今天未到期的任务。如何编写查询以包含给定员工的 所有 可能任务?
您需要 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
从第一个 table 中删除与您的 ON 条件不匹配的行。相比之下,LEFT JOIN
将它们留在原地,将 NULL 值放入第二个 table.
这个反加入任务有几种不同的解决方案。其中之一是使用 NOT EXISTS
SELECT *
FROM employee e
WHERE NOT EXISTS(
SELECT 1
FROM tasks t
WHERE e.id = t.assigned_emp and t.deadline = today
)