【问题标题】:How to select a column containing an array of values from a subquery in PostgreSQL?如何从 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

【问题讨论】:

    标签: sql arrays postgresql


    【解决方案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 秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2022-11-02
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多