2013-08-12 5 views
0

다음과 같은 상황이 있으며이를 해결하는 방법을 잘 모릅니다. 필요한 견해를 준비하는 방법에 대한 지침은 크게 감사하겠습니다.SQL 결합 자 테이블에서 유니온보기

내가 4 개 테이블이 있습니다
사용자 (사용자 ID INT, 사용자 이름 VARCHAR)
역할 (역할 ID의 INT, rolename의 VARCHAR)
BusinessUnit의 (buid의 INT, buname의 VARCHAR)
user_role_map을 (사용자 ID, 역할 ID, buid)

역할 테이블에는 "시스템 관리자"역할 인 id가 0 인 역할이 있으며 businessunit 테이블에는 IT 비즈니스 단위가 있습니다. 아래 쿼리로 인해 생성 된 사용자는 시스템 관리자로 간주되며 모든 비즈니스 단위에 대한 모든 액세스 권한을 가져야합니다.

SELECT userid FROM user_role_map WHERE roleid = 0 AND buid = 0 

나는 모든 사업 단위마다 "시스템 관리자"사용자의 목록에 union'd 모든 "비 시스템 관리자"를 표시하는보기를 구축 할 필요가있다. 첫 번째 부분은 아래 쿼리에서 쉽지만 두 번째 부분은 내가 고심하고있는 부분입니다. 내가 달성하기 위해 노력하고 무엇을 설명하는 데 도움이되는 몇 가지 예를 들어 데이터를 제공합니다

SELECT userid, roleid, buid FROM user_role_map WHERE roleid > 0 AND buid > 0 

:

users 
--------------- 
1, "sysAdmin" 
2, "salesUser1" 
3, "serviceUser1" 
4, "manager1" 
5, "salesUser2" 
6, "serviceUser2" 
7, "manager2" 
roles 
--------------- 
0, "SystemAdmin" 
1, "Full" 
2, "Update" 
3, "Read" 

BusinessUnit의 을 --------------- 0 "IT" 1 "fooSales" 2 "fooService" 3 "barSales" 4 "barService"0

1,233,747,716,292,219,273,872,613,210

마지막으로, 내가 (마지막 4 개 행을 참고) 위의 샘플 데이터를 다음 제공하는 뷰가 필요합니다

new view 
--------------- 
2, 1, 1 
2, 3, 3 
3, 1, 2 
3, 3, 4 
4, 1, 1 
4, 1, 2 
5, 1, 3 
5, 3, 1 
6, 1, 4 
6, 3, 3 
7, 1, 2 
7, 1, 4 
1, 1, 1 
1, 1, 2 
1, 1, 3 
1, 1, 4 

참고 : 예제 데이터 여기 만이 하나의 "시스템 관리자"사용자 만 이 유형의 사용자는 여러 명일 수 있습니다.

답변

0

당신은 같은 것을 할 수 있어야한다 :

declare @users table(userid int, username varchar(255)); 
insert into @users values (1, 'sysAdmin'); 
insert into @users values (2, 'salesUser1'); 
insert into @users values (3, 'serviceUser1'); 
insert into @users values (4, 'manager1'); 
insert into @users values (5, 'salesUser2'); 
insert into @users values (6, 'serviceUser2'); 
insert into @users values (7, 'manager2'); 


declare @roles table(roleid int, rolename varchar(255)); 
INSERT INTO @roles VALUES (0, 'SystemAdmin'); 
INSERT INTO @roles VALUES (1, 'Full'); 
INSERT INTO @roles VALUES (2, 'Update'); 
INSERT INTO @roles VALUES (3, 'Read'); 

DECLARE @user_role_map TABLE(userid INT, roleid INT, buid int) 
INSERT INTO @user_role_map values (1, 0, 0); 
INSERT INTO @user_role_map values (2, 1, 1); 
INSERT INTO @user_role_map values (2, 3, 3); 
INSERT INTO @user_role_map values (3, 1, 2); 
INSERT INTO @user_role_map values (3, 3, 4); 
INSERT INTO @user_role_map values (4, 1, 1); 
INSERT INTO @user_role_map values (4, 1, 2); 
INSERT INTO @user_role_map values (5, 1, 3); 
INSERT INTO @user_role_map values (5, 3, 1); 
INSERT INTO @user_role_map values (6, 1, 4); 
INSERT INTO @user_role_map values (6, 3, 3); 
INSERT INTO @user_role_map values (7, 1, 2); 
INSERT INTO @user_role_map values (7, 1, 4); 

DECLARE @businessunit TABLE(buid int, buidname VARCHAR(255)); 
INSERT INTO @businessunit VALUES (0, 'IT') 
INSERT INTO @businessunit VALUES (1, 'fooSales') 
INSERT INTO @businessunit VALUES (2, 'fooService') 
INSERT INTO @businessunit VALUES (3, 'barSales') 
INSERT INTO @businessunit VALUES (4, 'barService') 

--non-admin users 
SELECT userid, roleid, buid 
FROM @user_role_map 
WHERE 
    roleid > 0 AND buid > 0 

UNION ALL 

--get admin users and add a full control entry 
SELECT userid, 1, BusinessUnits.buid 
FROM @user_role_map m 
CROSS JOIN(
    --use this if you have a businessunit table you can leverage; otherwise, 
    --you can select distinct buid on role_map where buid > 0 
    SELECT buid 
    FROM @businessunit 
    WHERE buid > 0 
) AS BusinessUnits 
WHERE 
    roleid = 0 AND m.buid = 0 
0

비즈니스 단위를 UNION ALL과 함께 추가 할 수 있습니다.

SELECT 
    userid, 
    roleid, 
    buid 
FROM 
    user_role_map 
WHERE 
    roleid > 0 
    AND buid > 0 

UNION ALL 

/* append full control for system admins to all bussiness units */ 

SELECT 
    CAST(1 AS INT) AS userid, 
    CAST(1 as INT) AS roleid, 
    BU.buid 
FROM businessunit BU 
+0

안녕 souplex, 제안에 대한 감사하지만 1 사용자의 "시스템 관리자와이 내가 제공하는 명시 적으로 예를 들어이 단지 작품 "System Admin"사용자 수에 무제한으로이 작업이 필요합니다. – Aossey

+0

스토어드 프로 시저로 만들고 사용자 테이블에 가입하고 역할 ID를 매개 변수화 할 수 있습니다. – souplex