2017-07-24 54 views
0

我有一张Users的表格。每个User可以在多个Disciplines中,并且它们通过链接表User_Discipline链接。这些表格非常简单:凡基于链接表的条件

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 

说说John Doe是登录用户。 他需要能够选择任何学科中的所有用户列表。在给定的例子中,我需要一个查询来返回一个包含John和Jane的列表,因为John既是Civil也是Mechanical,而Jane是Mechanical。

我认为子选择是涉及到的,但到目前为止我所做的所有阅读都显示了如何对一个值进行子查询(例如,John的Civil Discipline)。我需要能够执行一个查询,该查询运行WHERE条件,但匹配John's Disciplines中的任何一个与其他人的Disciplines多对多。

我正在使用DataTables Editor .NET library来执行SQL,但我可以将常规SQL标记中的答案转换为该库。我在这里可能遇到的唯一限制是所有内容都必须在一个SQL语句中完成。我感谢任何帮助!

+0

你有没有尝试什么吗? –

+0

查询在哪里? – Eric

回答

2

像这样?

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

或'WHERE UserID =(选择ID来自用户WHERE名称='John Doe')' –

+0

OP对此并不清楚。这可能是因为他们有John Doe的登录ID。 – DVT

+0

来自OP:**我需要一个查询来返回John和Jane列表,因为John既是Civil和Mechanical,Jane也是Mechanical。* * – DVT

1

你可以用内完成所有连接:

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

我会更改为'DISTINCT ID,FULLNAME',总有两个不同的用户拥有相同的名称。 –

+0

@JuanCarlosOropeza好点。我已经相应编辑了 –