我在postgresql db中使用knex,我在表A中有一行,它与表B中的行有一对一关系,与表C中的行有一对多关系。
我想从A加入一行B和C,得到一个json,如
{
aCol1: ...,
b: {
bCol1: ...,
bCol2: ...,
},
c: [
{
cCol1: ...
},
{
cCol1: ...
}
]
}
其中,aCol
表示表A中的列,bCol
表示表B中的列,这是联合的。
如何通过一个查询和连接实现这一点?
3条答案
按热度按时间l7wslrjt1#
对此使用JsonAgg
SQL语句:
选择tA.id,tA.name,json_agg(tB)作为“tA”上“tB”的左连接“tA“中的tB。“tB_id”=“tB”。“id”分组依据“tA”。“id”,“tA”。“name”
膝关节:
1bqhqjot2#
你可以使用
JSON_AGG()
得到你想要的。你也可以使用Postgres的JSON操作符只得到一条记录而不是很多条。如果你想避免一个大的GROUP BY
子句,在你选择的主表上使用JSON_AGG()
而不是选择每一列。使用你的例子,看起来像这样:这将给予你一个很好的干净的结果,如:
agyaoht73#
您可以通过一个查询和连接来实现它,但它会变得过于复杂。您应该改用ORM。
Objection.js基于knex,允许您以一种简单且高性能的方式执行此类查询(您可以选择使用连接或多个查询,通常多个查询的性能更高)。
使用Objection.js语法时,它看起来如下所示: