2013-09-21 65 views
0

我一直在为此工作2天,同时重新学习我知道的有限数量的SQL,但我无法完成这一步。我的SQL技能最多也很弱,不常使用。我知道数据库没有正确规范化,但是我的表格不可能有超过几百个条目,性能是我最担心的问题。如果查询需要5分钟或更长时间才能运行,那么我就不会在乎这点:)。加入一个表格和2个链接器表格

我有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 

约翰获得融资明确分配,他allstaff访问是由于他在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的问题有点茫然。我在这一点上学到了很多东西,有人能把我推向终点线吗?

+0

您可以显示表中的样本数据。看起来你缺少一个'LEFT Join'来处理'Null'问题,但是不确定在dups上。 – christiandev

+0

我在一些示例表格数据中编辑过。 – user548369

+0

我终于不得不放弃SQL,并用PowerShell强制它完成项目。如果我不得不重做报告,我可能会在下个月再次用SQL来做这件事 – user548369

回答

0

我认为,如果你正在重复的值,然后利用DISTINCT与查询可以帮助你在没有得到重复的结果..