2014-06-16 103 views
-1

我有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' 

我想是这样的:

角色ID,角色,         用户名
                 联系         联系
                 学生     空

当我包括where子句,学生角色不是回

+1

你只在你有'u.UserName ='admin''的地方选择,'Student'角色对于'Username'有'Null'。它不符合where子句显示,是吗? – Nikola

+0

我意识到这一点,我需要的where子句只适用于右表,而不是左 – Swifty

+0

我讨厌它时,人-1你没有提供一个理由。懦夫。 – Swifty

回答

1

从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'。

+0

这工作,谢谢。我只是添加了一个独特的语句来摆脱UsersInRoles表中其他用户的记录导致的重复。 – Swifty

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) 
+0

尽管这会返回正确的结果,但更好的过滤最右边的表的方法是简单地应用UserName ='admin'直接在连接条件中进行筛选,而不是在WHERE子句中进行筛选。查看下面的解决方案。 – Dan