Postgres子查询-如何从子查询中以对象格式创建ALIAS

时间:2019-06-23 16:10:10

标签: sql json postgresql join

我正在尝试将多个查询包装为1个复杂查询。

这是场景。给定user_id为“ xxxxx-xx-xxxxx”,我必须在几个表中查询几个数据点。我下面的大多数查询都包含一些JOIN,但我真的很想看看是否有可能在我获得用户名电子邮件的地方获得最后一个查询。 strong>包装到存储为对象的ALIAS列中?我不确定是否可能,但是查询已分解。

漫长的路途

查询1:

SELECT * FROM requests WHERE created_by = 'xxxx-xx-xxxxx';

此查询将返回如下一行:

id   |   created_by   |   created_date ...
1141   xxxx-xx-xxxxx    2019-04-09 19:33:40.889+00 ...

然后我必须运行另一个查询来查找返回ID的所有批准者 查询2:

SELECT * FROM approvers WHERE request_id = 1141

这可能会返回许多这样的行:

request_id   |   user_id      |   decision    |    type   | .....
1141            xxxxx-xx-xxxxx       approve         approver     ......
1141            aaaaa-aa-aaaaa      approve         approver     ......
1141            bbbbb-bb-bbbbb    under review      watcher     ......
1141            ccccc-cc-ccccc      reject          approver     .......

最后要找到用户名,我必须运行查询(对于查询2的每个返回行) 查询3、4、5、6:

SELECT * FROM users WHERE id = 'xxxx-xx-xxxxx' LIMIT 1

将返回:

id           |     given_name     |     family_name     |     email     | .....
xxxx-xx-xxxxx      John                  Doe             johndoe@email.com    ....

是否可以运行子查询并创建ALIAS的{​​{1}}列,并将相关的批准者和用户存储为JSON对象?

所需查询/结果:

1个查询:

approver_info

这将产生以下结果:

SELECT * FROM requests
WHERE created_by = 'xxxxx-xx-xxxxx'
SUBQUERY HERE ...

2 个答案:

答案 0 :(得分:0)

似乎正在寻找加入

SELECT * 
FROM requests r
INNER JOIN  approvers a on r.id = a.id 
INNER JOIN users u on u.id = r.user_id 
WHERE r.created_by = 'xxxx-xx-xxxxx';

如果您需要将行结果的某些部分作为json,则可以尝试使用row_to_json()

select r.user_id, r.request_id,  row_to_json(row(your_col1,your_col2,.....))
FROM requests r
INNER JOIN  approvers a on r.id = a.id 
INNER JOIN users u on u.id = r.user_id 
WHERE r.created_by = 'xxxx-xx-xxxxx';

答案 1 :(得分:0)

您的查询可能如下所示:

SELECT r.id, r.created_by, r.created_date
    , (SELECT json_agg(au)
       FROM  (
          SELECT u.id, u.given_name, u.family_name, u.email, a.decision, a.type -- , ...
          FROM   approvers a
          JOIN   users     u ON u.id = a.user_id
          WHERE  a.request_id = r.id
          ) au
      ) AS approver_info
FROM   requests  r
WHERE  r.created_by = 'xxxx-xx-xxxxx';

使用相关子查询将与0-n相关的行聚合到JSON数组approver_info中。

LATERAL连接将是等效的选择:

嵌套子查询是一种使用原始列名作为键构建JSON数组的方法。还有其他(带有json_build_object()row_to_json()):