如何从 PostgreSQL 的子查询中选择包含值数组的列?

Posted

技术标签:

【中文标题】如何从 PostgreSQL 的子查询中选择包含值数组的列?【英文标题】:How to select a column containing an array of values from a subquery in PostgreSQL? 【发布时间】:2019-08-19 20:11:45 【问题描述】:

给定ManufacturerModel 的假设架构,是否可以选择具有包含模型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 的子查询中选择包含值数组的列?的主要内容,如果未能解决你的问题,请参考以下文章