[英]How to select records with no matches in the foreign table (Left outer join)
我有一个表可以保存我的资源:
还有一个包含关联的表
如何选择可用的Employee的资源,即不在关联表中?
我试过这个,但它不起作用:
select r.ress, r.ress_id
FROM Ressource r
LEFT outer JOIN Ressource_Employee_Association a ON r.ress_id = a.ress_id
WHERE a.emp_id = 'ID00163efea66b' and a.ress_id IS NULL
有任何想法吗?
谢谢托马斯
在LEFT JOIN之后应用WHERE子句。 这意味着您当前正在尝试获取Ressource_Employee_Association中没有匹配记录的结果,但emp_id
等于'ID00163efea66b'
。
但是如果没有匹配的记录, emp_id
怎么可能是除NULL
以外的任何东西?
一种选择是将WHERE子句的一部分移动到连接中......
SELECT
r.ress, r.ress_id
FROM
Ressource r
LEFT OUTER JOIN
Ressource_Employee_Association a
ON r.ress_id = a.ress_id
AND a.emp_id = 'ID00163efea66b'
WHERE
a.ress_id IS NULL
这将列出与员工'ID00163efea66b'
无关的所有资源。
编辑
你的评论意味着你想要的是......
- 列出所有员工的视图
- 为每个员工列出他们没有的每个资源
这需要一个列出所有员工的额外表格。
SELECT
*
FROM
Employee
CROSS JOIN
Ressource
WHERE
NOT EXISTS (SELECT * FROM Ressource_Employee_Association
WHERE emp_id = Employee.id
AND ress_id = Ressource.id)
这有用吗?
select r.ress, r.ress_id
from resource r
where not exists
(
select 1 from ressource_emplyee_association a
where a.emp_id = '...' and a.ress_id = r.ress_id
)
编辑
在此之前,我有以下内容,但根据以下评论进行了更改:
select r.ress, r.ress_id
from resource r
where not exists
(
select top 1 1 from ressource_emplyee_association a
where a.emp_id = '...' and a.ress_id = r.ress_id
)
SELECT *
FROM Ressource
WHERE ress_id IN (
SELECT ress_id,
FROM Ressource
MINUS
SELECT ress_id
FROM Ressource_Employee_Association
WHERE emp_id = 'ID00163efea66b'
);
在写完我的上述评论之后,看看提出的解决方案:我想我已经对你要做的事情有了更多的了解。
假设资源表中有无限数量的资源,您希望为每个员工选择未分配的资源(基于资源关联表中任何特定员工的不存在)。
为了实现这一目标(并获得全面的员工列表),您需要第3个表格,以便参考完整的员工列表。 您还需要将所有资源CROSS JOIN
连接到员工列表中(假设每个员工都可以访问每个资源),然后将您的关联列表LEFT JOIN
( LEFT OUTER JOIN
)放到resource_id
和employee_id
匹配的查询中在resource_id
在resources
表和employee_id
的employees
(分别)表。 然后,添加where子句,过滤掉将员工分配给资源的所有记录。 这将为您提供员工可用的资源,这些资源也未注销。 这是令人费解的,所以希望这个问题可以解释得更多:
SELECT e.employee_id, e.employee, r.res_id, r.res
FROM employees e
CROSS JOIN resources r
LEFT JOIN assigned_resources ar
ON ar.employee_id = e.employee_id AND r.res_id = ar.res_id
WHERE ar.res_id IS NULL
如果您没有employees
表,则可以使用分配的资源表来完成相同的操作,但您将仅限于选择已分配资源的员工。 您需要添加GROUP BY
查询,因为关联表中可能存在多个员工定义。 这是查询的样子:
SELECT e.employee_id, r.res_id, r.res
FROM assigned_resources e
CROSS JOIN resources r
LEFT JOIN assigned_resources ar
ON ar.employee_id = e.employee_id AND r.res_id = ar.res_id
WHERE ar.res_id IS NULL
GROUP BY e.employee_id, r.res_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.