2015-11-05 50 views
1

我在SQLSERVER 3個表:SQL加入許多一對多 - 3個表

tbl_Users   - User_ID, User_Name 
tbl_Roles   - Role_ID, Role_Name 
tbl_Users_Roles_MTM - User_ID, Role_ID 

用戶可以分配給他的多重角色,這將在許多一對多表顯示。

在我的存儲過程,我需要Role_Name這是分配給特定User_ID(這是作爲參數)。
我想我應該使用INNER JOIN(或左邊的一個...)。

在SO和其他論壇中有許多條目與這個問題幾乎相似,但不完全相同。我嘗試了很多,但現在我完全失去了手腳!

謝謝大家。

編輯:
隨着SO好心人的幫助下,我得到它的工作:

SELECT r.Role_Name 
     FROM tbl_Roles r 
     WHERE NOT EXISTS(
      SELECT 1 
      FROM tbl_Users_Roles_MTM ur 
      WHERE ur.User_ID = @User_ID 
      AND ur.Role_ID = r.Role_ID); 

這樣的人真棒!!!!!

+0

如果您添加一些示例表格數據和預期結果,則會更容易理解您的問題。 – jarlh

回答

1

嘗試此查詢:

SELECT r.Role_Name 
FROM tbl_Roles r 
WHERE NOT EXISTS (
    SELECT 1 
    FROM tbl_Users_Roles_MTM ur 
    WHERE ur.User_ID = @User_ID 
    AND ur.Role_ID = r.Role_ID); 
+0

最後一行應該是:'AND ur.Role_ID = r.Role_ID)',它的效果非常好。請編輯您的答案,並將其標記爲「答案」。現在我來看看這裏提出的其他建議。非常感謝! – gadi

+0

哎呀,我的壞,多麼可怕的錯字! :( –

0

你可以這樣做:

SELECT * 
FROM Roles 
WHERE Role_Name = @rolename 
    AND NOT EXISTS(SELECT 1 
       FROM tbl_Roles AS r 
       INNER JOIN tbl_Users_Roles_MTM AS ur ON ur.Role_ID = r.Role_ID 
       WHERE r.role_Name = @rolename 
        AND ur.User_ID = @User_ID); 

NOT EXISTS謂詞將確保角色不分配給任何用戶。

0
SELECT r.* 
FROM tbl_Roles r 
LEFT JOIN tbl_Users_Roles_MTM ur 
    ON r.Role_ID = ur.Role_ID 
    AND ur.User_ID = @User_ID 
WHERE ur.User_ID IS NULL 
0

我會做這樣的事情

select roles.Role_Name 
from tbl_Roles as roles 
    left join tbl_Users_Roles_MTM as userRoles 
     on userRoles.Role_ID = roles.Role_ID 
     and userRoles.[User_ID] = @User_ID 
where userRoles.Role_ID is null 

基本上左連接,然後只選擇那些行,其中尚未加入