我们有两个表。
表1-用户:包含用户
表2-限制:只能访问特定房间的用户。如果用户不在此表中,则他们可以访问所有房间。
现在,我需要一个查询,询问我在哪里通过会议室,并返回具有访问权限的用户。例如,我传递RoomId = 70,而我的预期结果是1、3。 1是因为它实际上只能访问70号房间,而3是因为它不在限制表中,所以它可以访问所有房间。
问题在于内部联接丢失了3号,而左联接丢失了2号。因此我无法弄清如何关联表格。有什么办法可以直接通过联接做到这一点?
答案 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
中删除,那么他们将可以访问所有房间。那似乎很危险。您应该明确列出用户有权访问的所有个房间。