2014-06-16 38 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