2016-04-01 43 views
3

該標題不太好,因此請考慮以下事項。我有五個表格:TSQL - 從具有多個連接路徑的表中選擇

而且我想獲得直接鏈接到它的用戶或通過配置文件間接獲得的所有權限。在不-相當,有SQL我想出來的,到目前爲止是這樣的:

SELECT [Pe].[Controller], 
     [Pe].[Action] 
FROM [PermissionSets] AS [PS] 
     JOIN [UserPermissionSets] AS [UPS] 
      ON ([UPS].[PermissionSetId] = [PS].[Id]) 
     JOIN [Users] AS [U] 
      ON ([U].[Id] = [UPS].[UserId]) 
     JOIN [Profiles] AS [P] 
      ON ([P].[Id] = [U].[ProfileId]) 
     JOIN [ProfilePermissionSets] AS [PPS] 
      ON ([PPS].[ProfileId] = [P].[Id]) 
     JOIN [Permissions] AS [Pe] 
      ON ([Pe].[PermissionSetId] = [PS].[Id]) 
WHERE [U].[Id] = 4; 

它返回行的正確計數,但它一遍又一遍地重複控制器或動作,所以它是錯的。我希望有人能幫我糾正它,以顯示用戶的所有不同的權限集。理想情況下,我想也改變它,以便它從用戶開始都被發現,因爲這是我在我需要做的事情中訪問的方法(該對象是一個名爲User的實體框架類,將使用LINQ)。

UPDATED因爲我忘了我真的想要的權限不是權限集。

+0

你只是在尋找'GROUP BY'? – ZLK

+0

不知道,我知道足夠的SQL來爲自己造成問題,哈哈。 – Gup3rSuR4c

+0

用戶是否總是在_UserPermissionSets_表中至少有一個條目?如果不是,則只能檢索在_UserPermissionSets_或_UserPermissionSets_和_Permissions_中具有條目的用戶。那麼你應該使用'LEFT OUTER JOIN'。 – schlonzo

回答

1

試試這個SQL

SELECT [Pe].[Controller], 
     [Pe].[Action] 
FROM [Users] AS [U] 
    LEFT OUTER JOIN [UserPermissionSets] AS [UPS] 
      ON ([UPS].[UserId] = [U].[Id]) 
    LEFT OUTER JOIN [ProfilePermissionSets] AS [PPS] 
      ON ([PPS].[ProfileId] = [U].[ProfileId]) 
    LEFT OUTER JOIN [Permissions] AS [Pe] 
      ON ([Pe].[PermissionSetId] = [UPS].[PermissionSetId]) 
      OR ([Pe].[PermissionSetId] = [PPS].[PermissionSetId]) 
WHERE [U].[Id] = 4; 
+0

這隻會產生直接相關的權限,並從配置文件中排除間接相關的權限。 – Gup3rSuR4c

+0

@ Gup3rSuR4c,查詢已更改,現在plz chk –

+0

我將您的示例細化爲「DISTINCT」,它給了我想要的結果。然後,我把它變成了一個視圖,並在EF實現中的User類中與它建立了一種假關係。很好的工作,並減少查詢只有一個和我的LINQ實現。謝謝! – Gup3rSuR4c

0

因此,在LINQPad亂搞,我想出了這個只要LINQ查詢:

user.PermissionSets.Union(user.Profile.PermissionSets).SelectMany(
    ps => 
     ps.Permissions.Select(
      p => 
       p.Controller + "." + p.Action)); 

它產生我想要的東西,但它確實它通過組合一堆SQL查詢的結果。最大的影響來自具有多個權限集的配置文件,例如管理員。我認爲沒有辦法解決這個問題,並且我只有一個User對象可以使用,所以我對於多餘的SQL查詢很滿意,至少現在是這樣。