如何从 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 的子查询中选择包含值数组的列?的主要内容,如果未能解决你的问题,请参考以下文章

错误:用作表达式的子查询返回多行。 POSTGRESQL / 查看器

PostgreSQL - 如何从“选择不同”查询创建“维度”表并创建主键和外键?

从 postgresql 数据库中选择值并根据我需要完整查询插入/更新

Postgresql - 使用带有改变序列表达式的子查询

Postgresql:如何查询包含某些值的 JSONb 数组

如何将 HTML 作为 PostgreSQL 插入查询中的值处理?