2014-11-23 66 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