显示不满足关系的行:这是正确的,还是有更简单的方法?

时间:2012-11-12 10:13:34

标签: tsql join

对于我们的一位客户,我必须为没有该角色的所有人启用ASP.NET角色。我当前的查询(有效)如下,但我知道这个查询可以变得更容易/更简单,并且我采用了一种迂回的方式。

ASP.NET成员资格模型如下:aspnet_Users与aspnet_Roles有多对多。多对多关系存储在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'

所以,基本上,我首先计算具有该角色的所有用户的交叉连接,然后减去已经在该角色中的每个人,以便获得的所有用户组。那个角色。

感觉就像是一种迂回的方式来解决这个问题。是否有更简单(或更直观)的方法来获得相同的结果?

1 个答案:

答案 0 :(得分: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)