Postgres:对外键运行“数据透视查询”吗?

时间:2018-09-07 10:39:04

标签: sql postgresql

我正在运行Postgres 9.6。我们有两个表,第一个是user

id   | integer
name | varchar

第二个是feature_flag,它具有user的外键:

id   | integer
user_id | integer

我想创建一个表用户,该表显示(除其他事项外)用户已启用的功能标志-可能带有一个用于功能标志的数组列(向更好的建议开放,例如可以是每个功能标志中带有T /的列F)。

所以结果可能看起来像这样:

id,name,flags
1,foo,"[1,3]"
2,bar,"[1,2]"

或者这样:

id,name,flag_1,flag_2,flag_3
1,foo,T,F,T
2,bar,T,T,F

我该怎么做?我知道如何为每个用户的每个标志获取一行:

   SELECT u.*, feature_flags 
   FROM "user" u
   OUTER JOIN feature_flag f on f.user_id=u.id

但是我如何将其向上滚动到上面?

1 个答案:

答案 0 :(得分:0)

您可以汇总标志:

SELECT u.*, array_agg(f.integer) as feature_flags
FROM "user" u
  LEFT JOIN feature_flag f on f.user_id=u.id
group by u.id;

以上要求"user".id是表"user"的主键

如果标志的上限,则可以使用以下内容创建列:

select id, name,
       1 = any(feature_flags) as flag_1, 
       2 = any(feature_flags) as flag_2, 
       3 = any(feature_flags) as flag_3, 
       .... 
from (
  SELECT u.*, array_agg(f.integer) as feature_flags
  FROM "user" u
    LEFT JOIN feature_flag f on f.user_id=u.id
  group by u.id
) t