2012-12-21 43 views
0

我有3个表Employee,ProjectAssignment。一名员工可以分配到多个项目,一个项目可以有多个员工。 Assignment表保持员工和项目之间的多对多关系。我想在sql server中的一个sql查询返回一个同时在多个项目上工作过的员工列表。基于多对多关系的sql查询

的Staructure

表雇员

EmpId, 
EmpName 

表项目

ProjId,ProjName,ProjStartDate,ProjEndDate 

分配

AssignmentId,ProjId,EmpId,AssStartDate,AssEndDate 

回答

1
Select EmpName,zt.* from 
(
Select a.EmpId,Count(*) as cnt 
from Assignment a 
Join Assignment b on a.EmpId=b.EmpId and a.ProjId<>b.ProjId 
and 
(
(a.AssStartDate>=b.AssStartDate and a.AssStartDate<=b.AssEndDate) 
or 
(a.AssEndDate>=b.AssStartDate and a.AssEndDate<=b.AssEndDate) 
or 
(b.AssStartDate>=a.AssStartDate and b.AssStartDate<=a.AssEndDate) 
or 
(b.AssEndDate>=a.AssStartDate and b.AssEndDate<=a.AssEndDate) 
) 
Group by a.EmpId 
Having Count(*)>1 
) zt 
join Employee e on e.EmpId=zt.EmpId 
+0

感谢Bummi快速answer.Meanwhile,我也来与解决方案 – user1920851

+0

选择ass.Eid,算上从分配的屁股(PID)NumOfProjects 内加入 (EID选择,MIN(AssStartDate)作为起始日期,MAX(AssEndDate)作为结束日期从ass.Eid = abc.Eid 分配 组通过EID)为abc 其中具有COUNT(驴abc.StartDate和abc.EndDate之间ass.AssStartDate 组由ass.Eid。 pid)> 1 – user1920851

+0

但是你的查询很不错,不同于传统的sql思维 – user1920851

0
Select a.EmpId from Assignment a join Assignment b on 
a.EmpId = b.EmpId 
and 
a.AssStartDate < b.AssEndDate 
and 
a.AssEndDate > b.AssStartDate 
+0

T他的查询没有给出预期的结果。 – user1920851

+0

我不明白为什么它不会。你能更具体一点吗?返回的数据集以何种方式不正确? – Hari