2

テーブルがあるとしましょう:

  1. ユーザー
  2. Users_in_Roles
  3. 役割
  4. Rights_in_Roles
  5. 権利

キーは標準です(UserFk、RoleFk、RightFk)

問題は、正しい X (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 ?

私はそのように試してみましたが、何が間違っているのか教えていただけますか?

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
4

2 に答える 2

3

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構文を学習するのに助けが必要な場合は、ここが参考になります。

于 2013-03-05T10:18:17.217 に答える
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
)

上記のクエリは、ロールに対してRoleFkandを返さないことに注意してください。Name

別のアプローチは次のとおりです。

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
于 2013-03-05T10:20:05.740 に答える