3

我的桌子是:

allowed(resourceid, personid)
person(personid, email)

我想打印出一个人是否有权访问资源,比如说resourceid = 2。结果应该是:

personright(personid, email, resourceid)

如果不允许此人访问资源 2,则 resourceid 应为 null。如果允许此人访问资源 2,则 resourceid 应为 2。

所以我希望每次执行我的查询时都会打印出整个用户列表。

我有一个使用子查询的工作解决方案,但我想通过连接来做到这一点。

select person.personid, person.email, allowed.resourceid
from person 
right join allowed on(person.personid = allowed.personid)
where (allowed.resourceid IS NULL OR allowed.resourceid = 2);

为什么这不起作用?

4

1 回答 1

4

根据您对问题的描述 - 它应该在这里左加入,而不是右加入。

select person.personid, person.email, allowed.resourceid
from person 
    left join allowed on person.personid = allowed.personid and allowed.resourceid = 2

另请注意,我已将allowed.resourceid = 2条件从where子句移至连接条件。因此,如果表中没有匹配的记录,并且等于allowed表中的相应记录 - 您将得到与所需完全一样的null 。resourceid = 2personidpersonidpersonallowed.resourceid

于 2015-07-16T12:55:43.520 回答