2014-11-23 5 views
0

, 교사, 학생, 학부모, 그래서 내가 카테고리로 Role 필드를 사용하여 학교에 관련된 모든 사람들 수집SQL 서버 자체는 가입하고 더 나는 수업이있는 학교를 가지고

테이블 USERS 년에 :

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"등급의 학생과 관련된 모든 사람 (예 : 학생, 교사 및 학부모)을 선택할 수 있기를 원합니다)

나는 ' .. 는 내가 자기 조인을 수행 할 필요가 생각이 같은 : 수행 할 m 수없는 그 클래스에 관련된 모든 사람을 선택하는 것입니다

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

+0

처음에는 모든 학생을 선택하고, 두 번째는 교사, 세 번째는 부모님을 선택했습니다. 하지만 최종 목표를 달성하기 위해 개선 할 수는 없습니다. : 예 : 는 사용자가 자신의 역할에 따라 모든 관련 사용자에게 전송 선택 내가 그 사람이나 그 부모 또는 둘, 또는 자신의 교사 또는 클래스를 선택 3 개 가지 역할 이메일 것이다 학생을 선택, 모든 학생에게 이메일/학부모/모두/모든 교사/모두 3 교사 선택, 모든 학생에게 전자 우편 이메일 학생/학부모/모두/교사/모두 3 30 개의 서로 다른 쿼리 작성을 피하기 위해 어떤 접근 방식을 사용합니까? – Joe

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