0

我已经为此工作了 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 有点精疲力尽。我学到了很多东西,有人能把我推过终点线吗?

4

1 回答 1

0

我认为如果你得到重复的值,那么在查询中使用DISTINCT可能会帮助你不得到重复的结果..

于 2013-09-21T13:27:42.810 回答