从左侧选择所有,仅从右侧选择

时间:2014-06-16 09:18:59

标签: sql

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

我想选择所有角色和用户匹配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'

我想要的是:

RoleId,角色,用户名
1管理员联系
2学生空

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

2 个答案:

答案 0 :(得分:1)

将过滤器从WHERE子句移动到Users表的连接条件:

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'

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

答案 1 :(得分:0)

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)