如何从 PostgreSQL 的子查询中选择包含值数组的列?
Posted
技术标签:
【中文标题】如何从 PostgreSQL 的子查询中选择包含值数组的列?【英文标题】:How to select a column containing an array of values from a subquery in PostgreSQL? 【发布时间】:2019-08-19 20:11:45 【问题描述】:给定Manufacturer
和Model
的假设架构,是否可以选择具有包含模型ID 数组的列的所有制造商?这就像UNNEST 的反面,但没有“nest”功能。
我试过了:
SELECT *, (SELECT md.id FROM model md WHERE md.parent_id = ma.id)
FROM manufacturer ma;
但得到了错误:
ERROR: more than one row returned by a subquery used as an expression
【问题讨论】:
【参考方案1】:当我输入问题时,我意识到解决方案是我错过了 ARRAY()
构造函数:
SELECT *, ARRAY(SELECT md.id FROM model md WHERE md.parent_id = ma.id)
FROM manufacturer ma;
来自文档:https://www.postgresql.org/docs/11/sql-expressions.html#SQL-SYNTAX-ARRAY-CONSTRUCTORS
编辑:上述方法虽然有效,但速度极慢。更好的方法是使用ARRAY_AGG()
加入表格并聚合它们:
SELECT ma.*, ARRAY_AGG(md.id)
FROM manufacturer ma
JOIN model md ON md.parent_id = ma.id
GROUP BY ma.id;
manufacturer.id
必须是主键才能使用ma.*
,但您可以按任何分组。
在我的数据库中,这个版本需要 6 秒来检索 3k 行,而上面的方法需要 67 秒。
【讨论】:
以上是关于如何从 PostgreSQL 的子查询中选择包含值数组的列?的主要内容,如果未能解决你的问题,请参考以下文章
错误:用作表达式的子查询返回多行。 POSTGRESQL / 查看器
PostgreSQL - 如何从“选择不同”查询创建“维度”表并创建主键和外键?
从 postgresql 数据库中选择值并根据我需要完整查询插入/更新