【问题标题】:Joining tables and creating a json out of the joined information加入表格并从加入的信息中创建一个 json
【发布时间】:2023-01-24 23:52:22
【问题描述】:
当一个表中的记录作为数组值放在另一个表的“新”列中时,有没有一种方法可以将 2 个表与一个查询连接到数据库?
(很清楚如何对两个表进行 2 个查询并在代码中处理结果,但是有没有办法只使用一个 SELECT 在查询“期间”连接表?)
所以,这是一个简单的例子:
表格1:
表 2:
| id |
id_t1 |
value |
| 1 |
1 |
v3 |
| 2 |
1 |
v4 |
| 3 |
2 |
v5 |
作为从表 1 中选择所有值并与表 2 连接的查询结果,应该有下一个对象数组(为了使示例更通用,表 2 中的 id_t1 是从连接结果中过滤出来的):
[
{
id: 1,
value: v1,
newColumnForJoinedValuesFromTable2: [ { id: 1, value: v3 }, { id: 2, value: v4} ]
},
{
id: 2,
value: v2,
newColumnForJoinedValuesFromTable2: [ { id: 3, value: v5 } ]
}
]
【问题讨论】:
标签:
sql
json
postgresql
join
deno
【解决方案1】:
您可以通过堆叠以下函数两次来实现您的 json:
-
JSON_BUILD_OBJECT,给定 <key,value> 对来构建你的 jsons
-
JSON_AGG,聚合你的数组
WITH tab2_agg AS (
SELECT id_t1,
JSON_AGG(
JSON_BUILD_OBJECT('id' , id_,
'value', value_)
) AS tab2_json
FROM tab2
GROUP BY id_t1
)
SELECT JSON_AGG(
JSON_BUILD_OBJECT('id' , id_,
'value' , value_,
'newColumnForJoinedValuesFromTable2', tab2_json)
) AS your_json
FROM tab1
INNER JOIN tab2_agg
ON tab1.id_ = tab2_agg.id_t1
查看演示 here。
【解决方案2】:
使用 lateral join 和 group by。
select json_agg(to_json(t)) from
(
select t1.id, t1.value,
json_agg(to_json(l)) as JoinedValues
from t1
cross join lateral (select id, value from t2 where id_t1 = t1.id) as l
group by t1.id, t1.value
) as t;
见demo