1

我有两张这样的桌子:

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

我尝试了几种 Join 方法,但我失败了<请提出任何建议。谢谢。

4

1 回答 1

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

所以内部查询获取两个表的笛卡尔积,然后区分它们。然后对于这些结果中的每一个,它都会在活动权限表中获得适当的权限。

为此使用左连接,任何空结果都意味着它们当前没有 activepermission,因此 pageactive 值为 false。

在此处查看演示

于 2013-07-04T23:01:11.657 回答