两个表获取其他表中具有公共值或没有值的值

时间:2019-02-07 10:35:31

标签: sql sql-server join

我们有两个表。

表1-用户:包含用户

表2-限制:只能访问特定房间的用户。如果用户不在此表中,则他们可以访问所有房间。

enter image description here

现在,我需要一个查询,询问我在哪里通过会议室,并返回具有访问权限的用户。例如,我传递RoomId = 70,而我的预期结果是1、3。 1是因为它实际上只能访问70号房间,而3是因为它不在限制表中,所以它可以访问所有房间。

问题在于内部联接丢失了3号,而左联接丢失了2号。因此我无法弄清如何关联表格。有什么办法可以直接通过联接做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以尝试使用UNION

SELECT usr.UserID  FROM Users usr 
JOIN Restrictions res ON usr.UserID = res.UserID
WHERE res.RoomID = @myParameter --we take the users permitted for given room

UNION

SELECT UserID
FROM Users
WHERE UserID NOT IN (
        SELECT DISTINCT UserID
        FROM Restriction
        ) --plus the users that have permission in all rooms

答案 1 :(得分:0)

我认为,这应该可行。您实际上不需要join即可解决问题。

select 
     userid
from
     users u
where
     userid is not in (
        select 
            userid 
        from 
            restrictions 
        where 
            userid = u.userid 
            and roomid = @roomId
        )

答案 2 :(得分:0)

我强烈建议您不要在子查询中使用not in。这只是一个危险的习惯。如果子查询返回 any NULL值,则外部查询返回无行

所以,我建议:

select userid
from users u
where exists (select 1
              from restrictions r
              where r.userid = u.userid and
                    r.roomid = 70
             ) or
      not exists (select 1
                  from restrictions r
                  where r.userid = u.userid
                 );

我也强烈建议您更改数据模型。如果某人可以访问一个房间,并且该行已从restrictions中删除,那么他们将可以访问所有房间。那似乎很危险。您应该明确列出用户有权访问的所有个房间。