2013-06-25 1 views
0

표준화 된 사용자 목록과 해당 액세스를 반환하는 Google 시스템 전체에서 사용할 수있는보기를 작성하려고합니다. TSQL :이 두 부분으로 구성된 레코드를 최적화하는 데 도움이 필요합니다.

Table: Users 
UserID UserName  IsAdmin 
---------------------------------- 
1   John   0 
2   Jane   1 
3   Mary   0 

Table: Clients 
ClientID ParentClientID  ClientName 
---------------------------------- 
1   NULL    Pepsico 
2   1     Pizza Hut 
3   1     Taco Bell 
4   1     KFC 
5   NULL    McDonalds 

Table: UsersInClients 
UserID ClientID 
---------------------------------- 
1   2 
1   3 
2   1 
3   5 

내 원하는 출력 :

UserID ClientID 
---------------------------------- 
1   2 --User 1 & 3 are not admins so list only includes IDs in UsersInClients table. 
1   3 
2   1 --If Users.IsAdmin = 1, it should return 
2   2 --all parent client and all child clients, 
2   3 --one row per client like this. 
2   4 
3   5 

내가이 일을 생각할 수있는 유일한 방법은 등의 열팽창 계수와 임시 테이블, 커서를 사용하고 있지만, 나는 이것이 내가 할 수있는 그래서보기를 할 수 있습니다 기대했다 내 검색어에 가입하십시오. 이 작업을 수행 할 수 있습니까?

고마워

+0

FYI 여전히 뷰 정의에서 'CTE'를 수행 할 수 있습니다 ... – JNK

답변

0

는 두 쿼리의 UNION으로, 다음과 같은 방법으로이 작업을 수행 할 수 있습니다.

은 (JOIN 조건 모두 단일에서이 작업을 수행 할 수있는 방법이있을 수 있지만, 이것은 디버깅 쉽습니다.)

SELECT UserId, ClientID 
FROM UsersInClients Uic INNER JOIN Users U ON Uic.UserId = U.UserID 
INNER JOIN Clients C ON (C.ClientID = Uic.ClientID OR C.ParentClientID = Uic.ClientID) 
WHERE U.IsAdmin = 1 

UNION ALL 

SELECT UserId, ClientID 
FROM UsersInClients Uic INNER JOIN Users U ON UIC.UserId = U.UserID 
INNER JOIN Clients C ON C.ClientID = Uic.ClientID 
WHERE U.IsAdmin = 0 
+0

감사합니다. JNK가 수정되었습니다. – Eterm

+0

또한 클라이언트의 부모 - 자식이 한 단계 깊이라고 가정합니다. 나의 예에서는 단지 한 레벨 깊이이지만, 5 또는 심지어 10 레벨의 깊이 일 수있다. – Losbear

+0

계층 구조가 두 개 이상 필요하면 SQL 2008 이상이 기본 인 계층 유형을 사용하는 것이 좋습니다. http://msdn.microsoft.com/en-us/magazine/cc794278.aspx – Eterm

0

당신은 무제한의 계층 구조가있는 경우, 귀하의 솔루션은 CTE가 될 것입니다.

WITH T AS 
(
    SELECT UC.UserId, UC.ClientId, U.IsAdmin 
    FROM UsersInClient UC 
    INNER JOIN Users U 
     ON UC.UserId = U.UserId 
    UNION ALL 
    SELECT T.UserId, C.ClientId, T.IsAdmin 
    FROM T 
    INNER JOIN Clients C 
     ON T.ClientId = C.ParentClientId AND T.IsAdmin = 1 
) 
SELECT * FROM T 

그리고 이것은보기 일 수 있습니다.

관련 문제