2012-12-21 76 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