我已经为此工作了 2 天,同时重新学习了我所知道的有限数量的 SQL,但我就是无法完成。我的 SQL 技能充其量是薄弱的,不经常使用。我知道数据库没有正确规范化,但我的表不可能有超过几百个条目,性能是我最不关心的问题。如果查询需要 5 分钟或更长时间才能运行,此时我不在乎 :)。
我有 3 张桌子:
UserTable: GroupTable: ShareTable:
username GroupName ShareName
realname username UserOrGroup
status PermissionLevel
按请求,表格中的数据:
username realname status
jdoe John Doe Active
jAdoe Jane Doe Active
groupname username
usersgroup jdoe
usersgroup jAdoe
admingroup jdoe
admingroup jAdoe
sharename userorgroup permissionlevel
finance jdoe read/write
allstaff usersgroup read/write
admin admingroup read
admin jAdoe read/write
我想要的是查看谁有权访问每个共享,他们的当前状态是什么,以及他们对共享的权限级别是什么。如果该访问基于组成员身份,我想查看组名,否则,我希望该列为 NULL。像这样的东西:
Real Name Status ShareName Permission GroupName
John Doe Active Finance Read/Write NULL
John Doe Active AllStaff Read/Write UsersGroup
John Doe Active Admin Read AdminGroup
Jane Doe Active Admin Read/Write NULL
Jane Doe Active Admin Read AdminGroup
Jane Doe Active AllStaff Read/Write UsersGroup
约翰的财务访问权是明确分配的,他的全体员工访问权是由于他在用户组中的成员身份,等等......
这让我很接近,但我得到了一些重复,没有得到我的空值。
SELECT
u.realName,
u.status,
s.ShareName,
s.Permissionlevel,
ug.GroupName
FROM dbo.usertable AS u
INNER JOIN dbo.Sharestable AS s
ON u.UserName = s.UserOrGroup
INNER JOIN dbo.grouptable as ug
ON u.UserName = ug.UserName
INNER JOIN dbo.Sharestable as s2
ON s2.UserOrGroup = ug.GroupName
ORDER BY u.realName
我不知道从这里去哪里。我试过重新排序玩左右连接的东西。我想下一步是尝试子查询,但我对问题 ATM 有点精疲力尽。我学到了很多东西,有人能把我推过终点线吗?