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 仅那些尚未联接的行
我在 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 仅那些尚未联接的行