sql 加入多对多 - 3 个表

sql join Many-To-Many - 3 tables

我在 sqlserver 中有 3 个 table:

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

一个用户可以分配给他多个角色,这将显示在多对多 table 中。

在我的存储过程中,我需要 Role_Name NOT 分配给特定的 User_ID(作为参数给出)。
我想我应该使用 INNER JOIN(或 LEFT 一个......)。

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);

所以人真棒!!!!!

你可以这样做:

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 谓词将确保角色未分配给任何用户。

试试这个查询:

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);
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

我会做这样的事情

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

基本上左联接,然后 select 仅那些尚未联接的行