Sql 从左侧选择“全部”,仅从右侧选择“仅在其中”

Sql 从左侧选择“全部”,仅从右侧选择“仅在其中”,sql,Sql,我有3个表,角色、用户角色和用户 我想选择所有角色,并且只选择用户与where子句匹配的用户记录 SELECT r.*, u.UserName FROM [dbo].[Roles] r LEFT JOIN [dbo].[UsersInRoles ] ur ON r.Id = ur.RoleId LEFT JOIN [dbo

我有3个表,角色、用户角色和用户

我想选择所有角色,并且只选择用户与where子句匹配的用户记录

    SELECT              r.*, u.UserName

    FROM                [dbo].[Roles] r

    LEFT JOIN           [dbo].[UsersInRoles ] ur
    ON                  r.Id = ur.RoleId

    LEFT JOIN           [dbo].[Users] u
    ON                  u.Id = ur.UserId

    WHERE               u.UserName = 'admin'
我想要的是:

角色ID、角色、用户名
1AdminAdmin
2StudentNull


当我包含where子句时,不会返回学生角色

将筛选器从where子句移动到用户表的联接条件:

SELECT              r.*, u.UserName
FROM                [dbo].[Roles] r
LEFT JOIN           [dbo].[UsersInRoles ] ur
ON                  r.Id = ur.RoleId
LEFT JOIN           [dbo].[Users] u
ON                  u.Id = ur.UserId
                AND u.UserName = 'admin'

这将返回来自角色的所有记录,以及来自UsersInRoles的任何匹配记录,但仅返回用户名等于“admin”的用户中的那些匹配记录。

您仅在您有
u.UserName='admin'
的位置进行选择,而
学生
角色对于
用户名
Null
。它与where子句不匹配,是吗?我意识到了这一点,我需要where子句只适用于正确的表,而不是左边的表。我讨厌人们在没有提供理由的情况下向你求助。虽然这会返回正确的结果,但过滤最右边表的一种更优雅的方法是直接在连接条件中而不是在WHERE子句中应用UserName='admin'过滤器。检查下面我的解决方案。这很有效,谢谢。我刚刚添加了一个独特的语句,以消除UsersInRoles表中其他用户记录造成的重复
SELECT              r.*, u.UserName

FROM                [dbo].[Roles] r

LEFT JOIN           [dbo].[UsersInRoles ] ur
ON                  r.Id = ur.RoleId

LEFT JOIN           [dbo].[Users] u
ON                  u.Id = ur.UserId

WHERE               (u.UserName = 'admin' or u.UserName is null)