获取与条件连接上所有相应记录匹配的记录

Get records that match all corresponding records on conditional join

我有一个业务问题,我将其表述为以下示例以便于交流。 假设我有三个 tables EmployeeProjectEmpWorkProjEmpWorkProj 用于 link 员工和他们从事的项目(或 link table 在 EmployeeProject 之间)。这是 table 数据的示例: Table: Employee

EmployeeID  EmpName
1           Alex
2           Pete
3           Mike

Table: Project

ProjectID   ProjectCity
11          NY
22          LA
33          NY
44          LA

Table: EmpWorkProj

EmployeeID  ProjectID
1            11
1            33
1            22
2            11
3            33
3            44

我想要return是在城市'NY'所有项目上工作的员工。在这个例子中,我想 return Alex 因为他是唯一一个在项目 ID 1133 上工作的员工。 我非常感谢使用标准 sql 的解决方案(无法部署递归 CTE、动态 sql 或游标)。谢谢。

您可以使用 group byhaving 解决此问题。对于每个员工,计算他们在纽约作为城市的项目数量。然后,在 having 子句中,查看是否是所有项目:

select ewp.employeeid
from EmpWorkProj ewp join
     Project p
     on ewp.projectid = p.projectid
where p.projectcity = 'NY'
group by ewp.employeeid
having count(*) = (select count(*) from project where projectcity = 'NY')

SELECT e.EmpName FROM Employee e, EmpWorkProj ewp,Project p WHERE ewp.ProjectID=p.ProjectID and p.ProjectCity='NY' and ewp.EmployeeID=e.EmployeeID;

这也有效:

declare @e table(EmployeeID int,  EmpName varchar(10))
declare @p table(ProjectID int,  ProjectCity varchar(10))
declare @ep table(EmployeeID int,  ProjectID int)

insert into @e values
(1 ,          'Alex'),
(2 ,          'Pete'),
(3 ,          'Mike')

insert into @p values
(11,          'NY'),
(22,          'LA'),
(33,          'NY'),
(44,          'LA')

insert into @ep values
(1,            11),
(1,            33),
(1,            22),
(2,            11),
(3,            33),
(3,            44)

;with cte as(select ProjectID from @p where ProjectCity = 'NY')
select ep.EmployeeID
from @ep ep
outer apply(select * from cte  except select ProjectID from @ep e where e.EmployeeID = ep.EmployeeID) o
group by ep.EmployeeID
having MAX(o.ProjectID) is null

所以我正在寻找的解决方案是这个,感谢 Giorgi 和 Gordon 帮助我看到它

SELECT E.EmpName
FROM Employees e 
WHERE NOT EXISTS (SELECT ProjectID 
                  FROM dbo.Project p
                  WHERE p.ProjectCity='NY'
                  EXCEPT 
                  SELECT ProjectID
                  FROM dbo.EmpWorkProj ep
                  WHERE ep.EmployeeID= e.EmployeeID);