2014-11-23 73 views
0

我有一個學校,同班級,教師,學生,家長等SQL服務器自加入多

USERS表我收集使用Role字段類別涉及到學校所有的人:

ID USERID  ROLE  CLASS  PARENTOF  SUBJECTS 
13 CarolineW parent     BillB  
12 IsabelF  parent     AlexC  
11 SaraW  teacher         MATH-3a,MATH-4a,MATH-5b 
10 JohnT  teacher         ENG4a,GEO2a 
9 MatildaW student  4a  
8 JohnC  student  4a  
7 AlexC  student  4a  
6 CamillaH student  4a  
5 BillB  student  2a  
4 AnnG  student  1a  

我希望能夠選擇(例如發送郵件)例如「4a」班的學生的所有家長,或者所有與「4a」班學生有關的人(因此學生,老師和家長) )

我在說什麼,米不能夠執行是選擇與該類別所有的人: 我想我必須進行自連接..這樣的事情:

select distinct 
    A1.userid, 
    A1.name, 
    A1.Role, 
    A1.ClassRoom 
from Users A1 
left join Users A2 
    on A1.ParentOf=A2.UserID 
left join Users A3 
    on CHARINDEX('4a',A3.Subjects) > 0 

和它的作品..但如果我添加像一個過濾器where class='4a',顯然不顯示我的老師和家長

但是我的技能做沒有讓我進一步去..

能有人指出我在正確的道路?

感謝

吉奧

回答

0

這將是簡單的使用UNION

select userid, 
     role, class 
from users 
where class ='4a' 
union all 
select userid, 
     role, '4a' 
from users 
where CHARINDEX('4a',Subjects) > 0 
union all 
select u2.userid, 
     u2.role, '4a' 
from users u1 
join users u2 
on u1.class = '4a' 
and u2.parentof = u1.userid 
order by role 
+0

喜來獲得滿意的結果! 感謝您的快速回答 – Joe 2014-11-24 06:34:46

+0

我可以清楚地瞭解你做了什麼:首先你選擇所有的學生,第二個老師,第三個父母...... 但我無法改進它來達到我的最終目標,那就是: 選擇一個用戶根據自己的角色發送給所有相關用戶: 即: 選擇一名學生,我會發電子郵件他或他的父母或他們兩個,還是他的老師或所有3個不同的角色 選擇一個類別,給所有的學生/所有的家長/所有的教師/所有的所有3 選擇一位教師,給所有學生/家長/雙方/教師/所有人發郵件3 哪種方法可以避免編寫30個不同的查詢? – Joe 2014-11-24 06:49:58

0

你也可以使用一個公共表表達式,如果你想它可能會更容易。例如,要找到所有的學生家長在特定的類,你可以這樣做:

--Variables for testing 
DECLARE @classid VARCHAR(10) 
SET @classid='2a' 

--Common table expression 
;WITH students 
AS 
(
SELECT 
[USERID] 
FROM USERS 
WHERE [CLASS][email protected] 
) 

,parents 
AS 
(
SELECT 
u.[USERID] 
FROM USERS u 
INNER JOIN students s ON u.[PARENTOF]=s.[USERID] 
) 

SELECT USERID FROM parents