连接表和2个链接器表

时间:2013-09-21 13:21:27

标签: sql

我一直在研究这个问题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

John明确分配了对财务的访问权限,他的所有访问权限都归功于他在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问题有点不满意。到目前为止,我学到了很多东西,有人能把我推到终点线吗?

1 个答案:

答案 0 :(得分:0)

我认为如果您获得重复值,那么在查询中使用 DISTINCT 可能会帮助您避免重复结果..