0

顧客の 1 人のために、ASP.NET の役割を持たないすべての人に対して ASP.NET の役割を有効にする必要がありました。私の現在のクエリ(動作する)は次のとおりですが、このクエリをより簡単/単純にすることができ、迂回した方法をとったという考えがあります。

ASP.NET メンバーシップ モデルは次のとおりです。多対多から aspnet_Roles を持つ aspnet_Users。この多対多の関係は、aspnet_UsersInRoles に格納されます。

SELECT 
  u2.UserId,
  u2.UserName,
  r2.RoleId,
  r2.RoleName   
FROM .[dbo].[aspnet_Users] u2
CROSS JOIN .[dbo].[aspnet_Roles] r2
WHERE not exists (
  SELECT 
    r.[ApplicationId]
    ,r.[RoleId]
    ,r.[RoleName]
    ,ur.[UserId]
    ,u.UserName
  FROM .[dbo].[aspnet_Roles] r
  INNER JOIN .[dbo].[aspnet_UsersInRoles] ur on r.RoleId = ur.RoleId
  INNER JOIN .[dbo].[aspnet_Users] u on u.UserId = ur.UserId
  WHERE r.RoleId = '73635AD6-0282-4289-85C4-7B4359D1D640' and u.UserId = u2.UserId
) AND r2.RoleId = '73635AD6-0282-4289-85C4-7B4359D1D640'

したがって、基本的には、最初にその役割を持つすべてのユーザーの相互結合を計算し、次にその役割に含まれていないユーザーの結果セットを取得するために、既にその役割にいるすべてのユーザーを差し引きます。

これを理解するのは回り道のように感じます。同じ結果に到達するためのより簡単な (またはより直感的な) 方法はありますか?

4

1 に答える 1

0

Sql Server 2005 以降を使用している場合。

;WITH cte AS (
 select u.userId from aspnet_Users u inner join aspnet_UsersInRoles ur
 on u.UserId = ur.UserId
 where ur.RoleId = '73635AD6-0282-4289-85C4-7B4359D1D640'
)
SELECT u.UserId,u.UserName,r.RoleId,r.RoleName 
FROM    aspnet_Users u INNER JOIN
        aspnet_UsersInRoles ur ON u.UserId = ur.UserId INNER JOIN
        aspnet_Roles r ON ur.RoleId = r.RoleId
WHERE u.UserId NOT IN (select UserId from cte)
于 2012-11-12T10:53:04.273 に答える