sql join多对多 - 3个表

时间:2015-11-05 13:38:06

标签: sql sql-server join many-to-many

我在sqlserver中有3个表:

CL.run(function* () {

  var photondata = 0;
  while (true) {

    yield CL.try(function* () {
      var data = yield photon.variable("witok", CL.cb());
      console.log("data: ", data.result);
      photondata = data.result;
    }, function* (err) {
      console.log(err.message);
    });

    if (photondata >= 1) break;

    yield CL.sleep(1000);

  }

  // do whatever you need here

});

用户可以为他分配多个角色,这将显示在“多对多”表中。

在我的存储过程中,我需要tbl_Users - User_ID, User_Name tbl_Roles - Role_ID, Role_Name tbl_Users_Roles_MTM - User_ID, Role_ID NOT 分配给特定的Role_Name(作为参数提供)。
我想我应该使用INNER JOIN(或LEFT one ...)。

SO和其他论坛中有很多条目的问题几乎与此类似但不完全相似。我做了很多实验但是现在我完全失去了手脚!

谢谢大家。

编辑:
在SO的优秀人才的帮助下,我得到了它的工作:

User_ID

太棒了!!!!!!

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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谓词将确保该角色未分配给任何用户。

答案 2 :(得分: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

答案 3 :(得分: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

基本上是左连接,然后只选择那些尚未连接的行