繁体   English   中英

如何选择外表中没有匹配的记录(左外连接)

[英]How to select records with no matches in the foreign table (Left outer join)

我有一个表可以保存我的资源:

资源| 的ressource-ID

还有一个包含关联的表

Ressource-ID | 员工ID

如何选择可用的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 JOINLEFT OUTER JOIN )放到resource_idemployee_id匹配的查询中在resource_idresources表和employee_idemployees (分别)表。 然后,添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM