我正在尝试将多个查询包装为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 ...
答案 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()
):