我在第一个表中有列
permission_id -权限
和列第二个表
user_id - permission_id -- is_allowed
现在,当user_id存在行时,下面的查询工作正常
select
f.permission,
coalesce(s.is_allowed,false) as is_allowed
from table1 f
left join table2 s on f.permission_id = s.permission_id
where s.user_id = 282
但当第二个表中没有该用户的行时,它返回null
我需要的是,它应该返回第一个表中的所有行,并且在第二个表中存在is_allowed,如果不存在,它应该返回false。
我尝试了s.is_allowed is null
,但输出不正确
第一个表是权限的主表,第二个表具有允许的权限的用户,因此我需要显示所有权限,然后如果允许则对它设置为true,否则为false,默认情况下,如果第二个表中没有用户条目,则应为false
谢啦
1条答案
按热度按时间qij5mzcb1#
如果我没理解错的话
也就是说,与你所拥有的正好相反,因为
table2
将包含user_id = 282
的数据,但它的permission_id
列将是 * 空 *(NULL
),并且没有值可以与所有权限的表连接。或者,使用
right
join:样本数据:
如果一切正常(用户100存在permission_id):
用户282的权限ID为空:
[编辑]
如果是另一种方式(如您所评论的),则:
这是您的“原始”查询,如果用户282在
where
子句中,则不返回任何内容;因为它会过滤掉行:如果你完全消除了这种情况会发生什么?查询然后返回用户100的行(因为通过权限ID在表之间有一个联接),并留下另一个没有用户ID的行,因为该用户没有联接:
或者,如果你想在用户282上应用过滤器,不要在
where
子句中使用它,而是使用 expand join条件;该结果是,尽管不同,因为它表明用户282不具有这两个权限: