2017-07-24 12 views
0

Ich habe eine Tabelle von Users. Jede User kann in mehreren Disciplines sein, und sie sind durch eine Verknüpfungstabelle verbunden, User_Discipline. Die Tische sind ziemlich geradlinig:Wo Bedingung basiert auf Link-Tabelle

User 
ID  Name   more... 
3 | John Doe | ... 
7 | Jane Smith | ... 
12 | Joe Jones | ... 

Discipline 
ID  name 
1 | Civil 
2 | Mechanical 
3 | Piping 

User_Discipline 
UserID  DisciplineID 
3  | 2 
3  | 1 
7  | 2 
12  | 3 

Say John Doe der angemeldete Benutzer ist. Er muss in der Lage sein, eine Liste aller Benutzer in einer seiner Disziplinen auszuwählen. In dem angegebenen Beispiel brauche ich eine Abfrage, die eine Liste mit John und Jane zurückgeben würde, da John sowohl Civil als auch Mechanical ist und Jane in Mechanical ist.

Ich denke, Sub-Selects sind beteiligt, aber alle Lesevorgänge, die ich bisher getan habe, haben gezeigt, wie Subselects auf einen Wert (z. B. Johns Civil Discipline) zu überprüfen. Ich muss in der Lage sein, eine Abfrage auszuführen, die eine WHERE-Bedingung ausführt, aber alle Johns Disciplines viele-zu-viele mit anderen Disciplines entspricht.

Ich verwende die DataTables Editor .NET library, um die SQL zu tun, aber ich kann eine Antwort in regulären SQL-Markup zu dieser Bibliothek übersetzen. Die einzige Einschränkung der Bibliothek, auf die ich hier stoßen könnte, ist, dass alles in einer einzigen SQL-Anweisung erledigt werden müsste. Ich schätze jede Hilfe!

+0

Haben Sie etwas versuchen? –

+0

Wo ist Ihre Anfrage? – Eric

Antwort

2

So ähnlich?

SELECT DISTINCT [User].ID, [User].Name 
FROM [User] 
    JOIN User_Discipline 
    ON [User].ID = User_Discipline.UserID 
WHERE 
    User_Discipline.DisciplineID IN (
    SELECT DisciplineID 
    FROM User_Discipline 
    WHERE UserID = <<John Doe's userID>> 
) 
+1

ODER 'WHERE UserID = (Wählen Sie ID FROM Benutzer WHERE Name = 'John Doe')' –

+0

Das OP war nicht klar hierüber. Es könnte sein, dass sie die ID von John Does Login haben. – DVT

+0

Vom OP: ** Ich brauche eine Abfrage, die eine Liste mit John und Jane zurückgeben würde, da John sowohl Civil und Mechanical als auch Jane in Mechanical ist. * * – DVT

1

Sie können alles mit inneren tun verbindet:

declare @users table (id int, fullname varchar(50)) 
declare @disciplines table (id int, discname varchar(50)) 
declare @userdisciplines table (userid int, discid int) 

insert into @users VALUES (3, 'John Doe') 
insert into @users VALUES (7, 'Jane Smith') 
insert into @users VALUES (12, 'Joe Jones') 

insert into @disciplines VALUES (1, 'Civil') 
insert into @disciplines VALUES (2, 'Mechanical') 
insert into @disciplines VALUES (2, 'Piping') 

insert into @userdisciplines VALUES (3, 2) 
insert into @userdisciplines VALUES (3, 1) 
insert into @userdisciplines VALUES (7, 2) 
insert into @userdisciplines VALUES (12, 3) 

SELECT distinct id, fullname from @users u 
INNER JOIN @userdisciplines ud ON ud.userid = u.id 
INNER JOIN 
(SELECT ud.discid FROM @users u 
inner join @userdisciplines ud on ud.userid = u.id 
WHERE u.fullname = 'John Doe') d ON d.discid = ud.discid 
+0

Ich würde zu 'DISTINCT ID, FULLNAME' wechseln, da immer die Möglichkeit besteht, dass zwei verschiedene Benutzer denselben Namen haben. –

+0

@JuanCarlosOropeza Guter Punkt. Ich habe das entsprechend bearbeitet –

Verwandte Themen