三个表格的SQL查询,检查其中任意一个表格

3
我有三张表: 1:员工表 2:部门表 3:专家表
我想要属于CmpId = 1的专家。
员工表:
id  CmpId 
1   2   
2   1   
3   1   

部门
id  CmpId 
1   1   
2   2   
3   2

专家们:
id  EmployeeId DepartmentId 
1   1          2
2   2          null
3   null       1
4   2          1
5   null       null

1
你使用哪种数据库管理系统?MySQL/SQL Server和PostgreSQL非常不同。 - Jens
2
你的样本数据有什么结果? - Gordon Linoff
我们需要使用哪个CmpId? - Navjot Singh
@Jens:使用SQL Server。我知道它们都不同,但查询可以转换为任何一种。Gordon Linoff:结果将是ID为2、3、4的专家。Navjot Singh:首先我必须考虑员工,如果为空,那么我才需要考虑部门。 - Hemant Malpote
3个回答

1

连接三个表进行内连接。

如果它们需要在BOTH中是CmpId = 1(在您的样本数据中返回为空,但假设它是一个更大的数据集)。

SELECT e.id, e.EmployeeId, e.DepartmentId
FROM Experts e
FULL OUTER JOIN Department d ON e.DepartmentId = d.id
FULL OUTER JOIN Employee em ON e.EmployeeId = em.id
WHERE d.CmpId = 1 AND em.CmpId = 1

如果需要在Either中 CmpId = 1
SELECT e.id, e.EmployeeId, e.DepartmentId
FROM Experts e
FULL OUTER JOIN Department d ON e.DepartmentId = d.id
FULL OUTER JOIN Employee em ON e.EmployeeId = em.id
WHERE d.CmpId = 1 OR em.CmpId = 1

我觉得你没有理解我的问题。你正在使用内连接,如果某些 expert.deptId 包含空值,那么连接的结果也会是空值。 - Hemant Malpote
@HemantMalpote 那就直接使用全外连接吧。回答已更新。 - Matt

1
我猜测expert表中的NULL表示某人是所有部门的专家。如果是这样的话:
select e.employeeid
from experts e join
     departments d
     on e.departmentid = d.id or e.departmentid is null;

1
如果我理解问题正确,基于样本数据所需的结果应该是专家ID 2、3和4。
专家ID 2具有员工ID为2的员工,其CmpID为1。 专家ID 3具有部门ID为1的部门,其CmpID为1。 专家ID 4具有员工ID为2的员工,其CmpID为1,且部门ID为1,其CmpID为1。
如果这确实是所需的结果集,我会编写以下查询。
SELECT ex.id, ex.EmployeeID, ex.DepartmentID
  FROM @Experts ex
  LEFT JOIN @Department dep
    ON ex.DepartmentID = dep.id
  LEFT JOIN @Employee emp
    ON ex.EmployeeID = emp.id
 WHERE dep.CmpID = 1 OR emp.CmpID = 1

这将产生以下结果。
id  EmployeeID  DepartmentID
2   2           NULL
3   NULL        1
4   2           1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接