2013-03-05 100 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語法有很大的參考: