2013-09-21 60 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與查詢可以幫助你在沒有得到重複的結果..