其中条件基于链接表

时间:2017-07-24 16:02:11

标签: sql sql-server datatables

我有一张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是土木和机械,简在机械。

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

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

2 个答案:

答案 0 :(得分: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 :(得分: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