2017-07-24 58 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好點。我已經相應編輯了 –