2009-06-28 10 views
0

Angenommen, ich eine VerknüpfungstabelleMitarbeiter und Abteilungen Datenbankabfrage mit SQL

EmployeeId DeptId 
--------- ------ 
    1  1 
    1  2 
    1  3 
    2  1 
    2  2 
    2  3 
    3  1 
    3  2 
    4  1 
    5  2 
    5  3 
    6  1 
    6  2 
    6  3 

So 1 Mitarbeiter kann in vielen Abteilungen arbeiten

Mein Problem ist, zu finden, haben die Mitarbeiter in mehreren Abteilungen funktioniert?

z.B.

Wenn ich einen Mitarbeiter gesucht werden soll, die für die Abteilung arbeitet 1,2,3, wird das Ergebnis sein: 1,2,6

Wenn ich einen Mitarbeiter gesucht werden soll, die für die Abteilung arbeitet 2 & 3 das Ergebnis sein wird, 1,2,5,6

Wenn ich möchten einen Mitarbeiter suchen, die für die Abteilung arbeitet 1 & 2 das Ergebnis 1,2 ,3,6

sein ich habe versucht, mit den folgenden Abfragen

a) SELECT DISTINCT EmployeeId FROM dbo.EmpDept WHERE DeptId in (2,3) 

habe ich falsches Ergebnis

b) SELECT DISTINCT EmployeeId FROM dbo.EmpDept WHERE DeptId = 2 AND DeptId = 3 

Dieses Mal habe ich mich

Bitte helfen keine Datensätze einsehen.

N.B. ~ Ich habe nur mein Echtzeit-Projektszenario simuliert. Ich kann die genauen Schema- oder Tabellennamen oder irgendetwas, das mit dem Projekt zusammenhängt, nicht offenlegen, da es vertraulich ist.

Vielen Dank im Voraus

Antwort

2

Diese Abfrage findet alle Mitarbeiter, die für mehr als eine Abteilung arbeiten.

select employeeid, count(*) 
from dbo.EmpDept 
group by employeeid 
having count(*) > 1; 

wenn Sie hoffen, die Mitarbeiter zu sammeln, Daten auf, die zwischen einer Reihe von spezifischen EmpDepts überqueren, können Sie verwenden, selbst verbindet:

select a.employeeid 
from dbo.EmpDept a, dbo.EmpDept b 
where a.employeeid = b.employeeid 
    and a.deptid = 1 
    and b.deptid = 2; 

diese Methode verwenden, werden Sie hinzufügen, müssen andere beitreten für jede neue Abteilung, die Sie suchen.

+0

Vielen Dank für Ihre großartige Hilfe –

+0

Gibt es noch einen anderen Weg, um beide Anfragen zusammen zu vereinigen. Ein Weg ist dynamisch sql. Irgendein anderer Weg? –

2
select employeeid 
from EmpDept 
where DeptId in (2,3) 
group by employeeid 
having count(*) = 2 

oder

select employeeid 
from EmpDept 
where DeptId in (1,2,3) 
group by employeeid 
having count(*) = 3 

die Zählung muss für die Anzahl der DeptIds Sie überprüfen So lassen. Diese Abfragen gehen davon aus, dass Sie die DeptIds angeben möchten, die ich aus Ihrer Frage zusammengestellt habe.

+0

Vielen Dank für Ihre großartige Hilfe –

+0

Gibt es noch einen anderen Weg, um beide Abfragen zusammen zu vereinen. Ein Weg ist dynamisch sql. Irgendein anderer Weg? –

2

Dies sollte es tun:

wählen EmployeeId, count (*) von EmpDept Gruppe von EmployeeId Zahl mit (*)> 1;