包含用户、角色和权限的SQL SELECT语句
假设我有桌子:包含用户、角色和权限的SQL SELECT语句,sql,sql-server,select,Sql,Sql Server,Select,假设我有桌子: 使用者 角色中的用户 角色 角色中的权限 权利 键是标准键(UserFk、RoleFk、RightFk) 问题是:如何让角色中的所有用户都具有正确的X(id=100) 我不知道如何解决这个问题。请帮助我,对不起我的英语 SELECT [dbo].[System_Users].[Id] ,[UserName] ,[FirstName] ,[LastName] ,[Email] ,RoleFk ,[dbo].[System_Roles].Name FROM
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
您需要
连接键关系上的表。基本结构将是:
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
语法的帮助,这里有一个很好的参考:
您可以尝试以下方法:
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
)
请注意,上述查询不会返回角色的RoleFk
和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
StackOverflow不是代码编写服务。请阅读并展示。你能告诉我们桌子的布局吗?好的,我会发布我的尝试:)我以前没有说过,但还有一个条件。用户必须具有权限,或者用户必须具有权限(id=100)。还有一个具有权限的表联接用户。您可以通过联接实现此操作吗?一切正常,我使用了您的第一个解决方案。谢谢:)不客气:)我很高兴它有帮助,我删除了我的第一个解决方案,因为它没有返回角色字段的RoleFk
和Name
。我返回这些列只是为了测试,我只需要用户Id和用户名;]