postgresql Pgsql从第二个表返回,即使没有记录存在

d8tt03nd  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(1)|浏览(167)

我在第一个表中有列

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
谢啦

qij5mzcb

qij5mzcb1#

如果我没理解错的话

from table2 s left join table1 f on f.permission_id = s.permission_id

也就是说,与你所拥有的正好相反,因为table2将包含user_id = 282的数据,但它的permission_id列将是 * 空 *(NULL),并且没有值可以与所有权限的表连接。
或者,使用right join:

from table1 f right join table2 s on f.permission_id = s.permission_id

样本数据:

SQL> select * from table1;

PERMISSION_ID PERMISSION
------------- ------------
            1 permission 1
            2 permission 2

SQL> select * From table2;

   USER_ID PERMISSION_ID IS_A
---------- ------------- ----
       100             1 true
       282

如果一切正常(用户100存在permission_id):

SQL> select s.user_id,
  2         f.permission,
  3         coalesce(s.is_allowed, 'false') as is_allowed
  4  from table2 s left join table1 f on f.permission_id = s.permission_id
  5  where s.user_id = 100;

   USER_ID PERMISSION   IS_AL
---------- ------------ -----
       100 permission 1 true

用户282的权限ID为空:

SQL> select s.user_id,
  2         f.permission,
  3         coalesce(s.is_allowed, 'false') as is_allowed
  4  from table2 s left join table1 f on f.permission_id = s.permission_id
  5  where s.user_id = 282;

   USER_ID PERMISSION   IS_AL
---------- ------------ -----
       282              false

SQL>

[编辑]

如果是另一种方式(如您所评论的),则:
这是您的“原始”查询,如果用户282在where子句中,则不返回任何内容;因为它会过滤掉行:

SQL> select s.user_id,
  2         f.permission,
  3         coalesce(s.is_allowed, 'false') as is_allowed
  4  from table1 f left join table2 s on f.permission_id = s.permission_id
  5  where s.user_id = 282;

no rows selected

如果你完全消除了这种情况会发生什么?查询然后返回用户100的行(因为通过权限ID在表之间有一个联接),并留下另一个没有用户ID的行,因为该用户没有联接:

SQL> select s.user_id,
  2         f.permission,
  3         coalesce(s.is_allowed, 'false') as is_allowed
  4  from table1 f left join table2 s on f.permission_id = s.permission_id;

   USER_ID PERMISSION   IS_AL
---------- ------------ -----
       100 permission 1 true
           permission 2 false

或者,如果你想在用户282上应用过滤器,不要在where子句中使用它,而是使用 expand join条件;该结果是,尽管不同,因为它表明用户282不具有这两个权限:

SQL> select s.user_id,
  2         f.permission,
  3         coalesce(s.is_allowed, 'false') as is_allowed
  4  from table1 f left join table2 s on f.permission_id = s.permission_id and s.user_id = 282;

   USER_ID PERMISSION   IS_AL
---------- ------------ -----
           permission 1 false
           permission 2 false

相关问题