2013-07-04 35 views
1

我有2個表像所有的數據:顯示從權限表

PermissionsTbl 
__________________ 
PermissionID   int   NotNull 
PermissionDescription nvarchar(100) NotNull 

PermissionID  PermissionDescription 
1    Human Resources 
2    Employees Data 
3    Departements 

ActivePermissionsTbl 
________________________ 
ActivePermID bigint NotNull 
PermissionID int NotNull 
UserID   int NotNull 
PageActive bit NotNull 

ActivePermID PermissionID UserID  PageActive   
1   1   1  True 
2   2   1  True 
3   3   2  True 

我要的是數據顯示這樣的:

PermissionID  PermissionDescription PageActive  UserID    
1     Human Resources   True   1 
2     Employees Data   True   1 
3     Departements       1 
1     Human Resources      2 
2     Employees Data       2 
3     Departements   True   2 

我嘗試加入的幾種方法,但我失敗了<請提出任何建議。 謝謝。

回答

1

我敢肯定有人能找到一個更優雅/有效的解決方案,但是這似乎給你所需要的東西:

SELECT 
    a.PermissionID , 
    A.PermissionDescription , 
    ISNULL(ap.PageActive , 0) 'PageActive' , 
    a.UserID 
FROM 
(
    SELECT DISTINCT 
     * 
    FROM permissionstbl p 
    CROSS JOIN 
    (
     SELECT 
      userid 
     FROM activepermissionstbl 
    ) 
    a 
) 
a 
LEFT JOIN activepermissionstbl ap ON ap.userid = a.userid AND ap.permissionid = a.permissionid 
ORDER BY a.userid 

所以內部查詢得到兩個表,然後distincts的笛卡爾乘積他們。然後,對於這些結果中的每一個,它都會在活動權限表中獲得適當的權限。

對此使用左連接,以便任何空結果意味着它們當前不具有主動權限,因此pageactive值爲false。

View Demo Here