Sql 从左侧选择“全部”,仅从右侧选择“仅在其中”
我有3个表,角色、用户角色和用户 我想选择所有角色,并且只选择用户与where子句匹配的用户记录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
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)