首页 > 解决方案 > 2个资源关系-为每条记录选择每条记录-即使pivot没有定义它

问题描述

我有 2 个资源:用户和权限 - 还有一些连接表,例如user_privilege

所以我的结构是这样的:

user
user_id, name
1        John
2        Daniel
3        Paul


privilege
privilege_id, name
1             Perm 1
2             Perm 2
3             Perm 3

user_privilege
user_id, privilege_id
1        1
1        2
2        1

如果 user_privilege 中有记录,则表示用户具有此权限。

但我也想选择用户没有的权限。

选择所有给定的权限很容易

但我想要像这样的输出:

privilege_id, user_id, has
1             1        true
2             1        true
3             1        false
1             2        true
2             2        false
3             2        false
1             3        false
2             3        false
3             3        false

所以实际上它就像每个用户的每个特权一样 - 但是如果用户有这个特权或者没有这个信息。

我想在 Posgres db 中这样做。

标签: sqlpostgresql

解决方案


你想要一个交叉连接userprivilege然后做一个外部连接user_privilege来测试那个用户是否有权限

select au.user_id, au.privilege_id,
       up.privilege_id is not null as has_priv
from (
  select u.user_id, p.privilege_id
  from "user" u
    cross join privilege p
) au
  left join user_privilege up on (au.user_id, au.privilege_id) = (up.user_id, up.privilege_id)
order by user_id, privilege_id   

在线示例


推荐阅读