是否建议或甚至可以从多个表中进行选择,并将某些表的结果指定为查询结果中的新列?
假设我有3个表:cars
,records
,maintenance
如果给定一个汽车id为“1234”,我想从具有该id的cars
中选择*
,并创建两个名为race_records
和maintenance_history
的新列(仅在结果中),这将是来自records
和maintenance
的所有匹配行的数组
或者在这种情况下,您通常会进行多个单独的查询吗?
是否建议或甚至可以从多个表中进行选择,并将某些表的结果指定为查询结果中的新列?
假设我有3个表:cars
,records
,maintenance
如果给定一个汽车id为“1234”,我想从具有该id的cars
中选择*
,并创建两个名为race_records
和maintenance_history
的新列(仅在结果中),这将是来自records
和maintenance
的所有匹配行的数组
或者在这种情况下,您通常会进行多个单独的查询吗?
2条答案
按热度按时间ukxgm1gy1#
如果你尝试一个三重连接,你会将
records
行乘以maintenance
行(一辆有2条记录和2次维护的汽车会产生4行,每行都是这两条记录的组合)。你可以使用一个标量子查询来聚合-从技术上讲,这些不是 * 单独的查询 *。Demo:字符串
| ID|名称|记录|维护|
| --|--|--|--|
| 1234 |我的车|{"(1,1234,record1)","(2,1234,record2)"}|{"(1,1234,maintenance1)","(2,1234,maintenance2)"}|
Array_agg()
会产生所有匹配行的适当类型的数组,允许您通过索引和字段(列)名称进行下标:型
| ID|名称|pg_typeof|标题|描述|
| --|--|--|--|--|
| 1234 |我的车|记录[]|记录1|维护2|
根据您以后对它们的处理,您可能会考虑使用
jsonb_object_agg()
。是否建议或甚至可以从多个表中进行选择,并将某些表的结果指定为查询结果中的新列?
基于输入值的某种转换创建一个新列,并给它一个新别名,这是一件非常常见的事情。
在这种情况下,您通常会进行多个单独的查询吗?
SQL是声明式的。主要思想是你告诉系统 * 你想要的到底是什么,而系统决定 * 如何交付它-试图将操作分成“步骤”与这个想法背道而驰。理想情况下,如果你可以用一条语句来陈述你的业务,你就这样做:你给予的关于你目标的上下文越多,planner就能更好地选择实现目标的方法,并优化操作。
你可以一步一步地做,但最好的情况是,你最终会手动布局规划器可以自己想出的相同逻辑-你可以玩
explain analyze
,看看你的数据如何被处理和交付的底层机制。你当然可以尝试想出比这更快/更便宜的方法,在这种情况下,我们鼓励你分享它们,看看它们是否可以内置到PostgreSQL中。8zzbczxx2#
您可以使用string_agg()在单个列中执行行值的聚合。
下面的例子可以帮助你。
字符串
输出量:
型