3

を使用して SQL ステートメントを作成しようとしましたWITHが、うまくいきません。

次の表を取得しました。

グループ (ID、名前)

1, 'My app'
2, 'Local admins'
3, 'Global admins'

ユーザー (1, 名前)

1, 'Arne'

GroupOwners (GroupId、OwnerType、OwnerId)

1, 'Group', 2

GroupMembers (GroupId、MemberType、MemberId)

2, 'Group', 3
3, 'User', 1

Arneの所有者であるすべてのグループを見つけようとしています。この場合はMy App. しかし、問題はそれLocal Adminsが所有者として設定されていることです。のメンバーGlobal adminsですLocal admins。そしてArneついにメンバーにGlobal admins

ここに画像の説明を入力

ダイヤモンドは気にしないでください、それらは間違っています

入れ子はグループごとに異なります。(ユーザーを直接 GroupOwners に持つものもあれば、ユーザーをメンバーとして持つ 1 つのグループを持つものもあります)

SQL文のマザー1つで解決できますか?追加の制約: Groups/Usersはシステムの他の場所で使用されます。

4

2 に答える 2

4

This is recursive cte that will first find groups Arno is a member of and then match all the groups that directly or indirectly contain those groups. Results are finally joined to GroupOwners to limit results. Note: if Arno might be owner of a group, but not a member of it, this query will need UNION to append these groups also.

declare @UserID int = 1

; with allTheGroups as (
  select gm.GroupID
    from GroupMembers gm
   where gm.MemberType = 'User'
     and gm.MemberID = @UserID
  union all
  select gm.GroupID
    from GroupMembers gm
   inner join allTheGroups
      on gm.MemberID = allTheGroups.GroupID
   where gm.MemberType = 'Group'
)
select Groups.*
  from Groups
 inner join GroupOwners gow
    on Groups.ID = gow.GroupID
   and gow.OwnerType = 'Group'
 inner join allTheGroups a
    on gow.OwnerID = a.GroupID

Sql Fiddle with example is here.

Example union to retrieve users who directly own a group added. Needs to be appended to query above (and select list tweaked, of course).

union
select gow.OwnerID, Users.Name
  from GroupOwners gow
 inner join Users
    on gow.OwnerID = Users.ID
   and gow.OwnerType = 'User'
 where gow.OwnerID = @UserID
于 2012-08-28T08:06:06.980 に答える
-2

はい、テーブルが正しくモデル化されていません。必要なテーブルは 2 つだけです。グループと管理者 (シナリオによってはユーザー)。

次に、「ローカル」、「グローバル」、または名前 (Arne) などを Admin/User テーブルに保存します。次に、2 つのテーブルのみの間の単純な選択または結合です。ネスト/再帰は必要ありません。

ERDまたは説明する何かを描く必要がある場合はお知らせください.

于 2012-08-28T06:32:43.150 に答える