2013-03-05 92 views
2

SQL SELECT语句比方说,我有表:与用户,角色和权限

  1. 用户
  2. Users_in_Roles
  3. 角色
  4. Rights_in_Roles
  5. 权利

键是标准(UserFk,RoleFk,RightFk)

现在的问题是:如何获得所有用户在右侧角色(id = 100)

我不知道如何触及这个问题。请帮助并为我的英语感到抱歉。

SELECT [dbo].[System_Users].[Id] 
    ,[UserName] 
    ,[FirstName] 
    ,[LastName] 
    ,[Email] 
    ,RoleFk 
    ,[dbo].[System_Roles].Name 
    FROM [dbo].[System_Users] 
INNER JOIN [dbo].[System_Roles_System_Users] 
ON [dbo].[System_Roles_System_Users].UserFk = [dbo].[System_Users].Id 
INNER JOIN [dbo].[System_Roles] 
ON [dbo].[System_Roles].Id = [dbo].[System_Roles_System_Users].RoleFk 

WHERE ? 

我tryied某事像,你能告诉我什么IW错了吗?

SELECT 
DISTINCT System_Users.Id, 
System_Users.FullName 
FROM System_Users 
INNER JOIN Dict_Rights_System_Users 
ON System_Users.Id = Dict_Rights_System_Users.UserFk 
INNER JOIN System_Roles_System_Users 
ON System_Roles_System_Users.UserFk = System_Users.Id 
WHERE 
RightFk = 136 
OR 
136 IN (SELECT Dict_Rights_System_Roles.RightFk FROM Dict_Rights_System_Roles WHERE    
Dict_Rights_System_Roles.RoleFk = System_Roles_System_Users.RoleFk) 
ORDER BY System_Users.FullName ASC 
+2

的StackOverflow是不是代码编写的服务。请阅读[提问一个好问题的指南](http://tinyurl.com/so-hints)并显示[你尝试过的](http://whatyouhavetried.com)。 – 2013-03-05 10:17:20

+0

你能告诉我们关于桌子的布局吗? – Guido 2013-03-05 10:17:44

+0

好吧,我会张贴我的尝试:) – Ellbar 2013-03-05 10:18:16

回答

2

你可以用这个尝试:

SELECT * 
FROM Users u 
WHERE EXISTS (
     SELECT ur.RoleFk 
     FROM Users_in_Roles ur 
     WHERE u.UserPk = ur.UserFk 
     AND  EXISTS 
       (
        SELECT 1 
        FROM Rights_in_Roles rr 
        WHERE rr.RoleFk = ur.RoleFk 
        AND  rr.RightFk = 100 
       ) 
) 
OR EXISTS (

     SELECT 1 
     FROM Users_Rights uri 
     WHERE u.UserPk = uri.UserFk 
     AND  uri.RightFk = 100 
) 

请注意,上述查询不返回RoleFkName为角色。

另一种方法是:

SELECT u.Id 
     ,u.UserName 
     ,u.FirstName 
     ,u.LastName 
     ,u.Email 
     ,rr.RoleFk 
     ,r.Name 
FROM Users u 

     -- get users that are in role that has right 
LEFT JOIN 
     Users_in_Roles ur ON 
     ur.UserFk = u.UserPk 
LEFT JOIN 
     Rights_in_Roles rr ON 
     rr.RoleFk = ur.RoleFk 
AND  rr.RightFk = 100 
LEFT JOIN 
     Rights r ON 
     r.RolePk = rr.RoleFk 

     -- get users that have a right granted to them directly 
LEFT JOIN 
     Users_Rights uri ON 
     u.UserPk = uri.UserFk 
AND  uri.RightFk = 100 

WHERE rr.RoleFk IS NOT NULL OR uri.UserFk IS NOT NULL 
+0

我没有说过,但还有一个条件。用户必须拥有权利或用户必须具有正确的角色(id = 100)。还有一个表将用户加入权限。 – Ellbar 2013-03-05 10:28:15

+0

好吧,我更新了我的答案,你可以试试看... – 2013-03-05 10:35:05

+0

你能通过Joins做到这一点吗? – Ellbar 2013-03-05 10:44:24

2

您将需要JOIN关键关系表。其基本结构为:

select u.Id, 
    u.UserName, 
    u.FirstName, 
    u.LastName, 
    u.Email, 
    r.RoleFk, 
    r.Name RoleName, 
    rt.Name RightName 
from users u 
inner join users_in_roles ur 
    on u.id = ur.userfk 
inner join roles r 
    on ur.rolefk = r.id 
inner join rights_in_roles rr 
    on r.rolefk = rr.rolefk 
inner join rights rt 
    on rr.rightfk = rt.id 
where rt.id = 100 

如果您需要帮助,在这里学习JOIN语法有很大的参考: