我有一张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语句中完成。我感谢任何帮助!
答案 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