postgresql 从多个表中选择,并将结果分配给新列

rqmkfv5c  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(125)

是否建议或甚至可以从多个表中进行选择,并将某些表的结果指定为查询结果中的新列?
假设我有3个表:carsrecordsmaintenance
如果给定一个汽车id为“1234”,我想从具有该id的cars中选择*,并创建两个名为race_recordsmaintenance_history的新列(仅在结果中),这将是来自recordsmaintenance的所有匹配行的数组
或者在这种情况下,您通常会进行多个单独的查询吗?

ukxgm1gy

ukxgm1gy1#

如果你尝试一个三重连接,你会将records行乘以maintenance行(一辆有2条记录和2次维护的汽车会产生4行,每行都是这两条记录的组合)。你可以使用一个标量子查询来聚合-从技术上讲,这些不是 * 单独的查询 *。Demo

select c.*, 
      (select array_agg(r) from records as r     where c.id=r.car_id) as records,
      (select array_agg(m) from maintenance as m where c.id=m.car_id) as maintenance
from cars as c;

字符串
| ID|名称|记录|维护|
| --|--|--|--|
| 1234 |我的车|{"(1,1234,record1)","(2,1234,record2)"}|{"(1,1234,maintenance1)","(2,1234,maintenance2)"}|
Array_agg()会产生所有匹配行的适当类型的数组,允许您通过索引和字段(列)名称进行下标:

select id,
       name, 
       pg_typeof(records), 
       records[1].title, 
       maintenance[2].description 
from(select c.*, 
            (select array_agg(r) from records as r where c.id=r.car_id) as records,
            (select array_agg(m) from maintenance as m where c.id=m.car_id) as maintenance
     from cars as c
) as subquery;


| ID|名称|pg_typeof|标题|描述|
| --|--|--|--|--|
| 1234 |我的车|记录[]|记录1|维护2|
根据您以后对它们的处理,您可能会考虑使用jsonb_object_agg()
是否建议或甚至可以从多个表中进行选择,并将某些表的结果指定为查询结果中的新列?
基于输入值的某种转换创建一个新列,并给它一个新别名,这是一件非常常见的事情。
在这种情况下,您通常会进行多个单独的查询吗?
SQL是声明式的。主要思想是你告诉系统 * 你想要的到底是什么,而系统决定 * 如何交付它-试图将操作分成“步骤”与这个想法背道而驰。理想情况下,如果你可以用一条语句来陈述你的业务,你就这样做:你给予的关于你目标的上下文越多,planner就能更好地选择实现目标的方法,并优化操作。
你可以一步一步地做,但最好的情况是,你最终会手动布局规划器可以自己想出的相同逻辑-你可以玩explain analyze,看看你的数据如何被处理和交付的底层机制。你当然可以尝试想出比这更快/更便宜的方法,在这种情况下,我们鼓励你分享它们,看看它们是否可以内置到PostgreSQL中。

8zzbczxx

8zzbczxx2#

您可以使用string_agg()在单个列中执行行值的聚合。
下面的例子可以帮助你。

SELECT string_agg(name::text, ',') as new_column FROM cars;

字符串
输出量:

Swift,Creta,Scorpio,Alto

相关问题