获取与条件连接上所有相应记录匹配的记录
Get records that match all corresponding records on conditional join
我有一个业务问题,我将其表述为以下示例以便于交流。
假设我有三个 tables Employee
、Project
、EmpWorkProj
。 EmpWorkProj
用于 link 员工和他们从事的项目(或 link table 在 Employee
和 Project
之间)。这是 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 11
和 33
上工作的员工。
我非常感谢使用标准 sql 的解决方案(无法部署递归 CTE、动态 sql 或游标)。谢谢。
您可以使用 group by
和 having
解决此问题。对于每个员工,计算他们在纽约作为城市的项目数量。然后,在 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);
我有一个业务问题,我将其表述为以下示例以便于交流。
假设我有三个 tables Employee
、Project
、EmpWorkProj
。 EmpWorkProj
用于 link 员工和他们从事的项目(或 link table 在 Employee
和 Project
之间)。这是 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 11
和 33
上工作的员工。
我非常感谢使用标准 sql 的解决方案(无法部署递归 CTE、动态 sql 或游标)。谢谢。
您可以使用 group by
和 having
解决此问题。对于每个员工,计算他们在纽约作为城市的项目数量。然后,在 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);