sql - 为什么这个查询需要聚合?

标签 sql postgresql subquery aggregate

我正在尝试将 2 个表连接到一个表 book(它们具有一对一关系),然后嵌套一个一对多关系 ebooks

如果我尝试嵌套一对多结果,它工作正常:

select r.*, array_agg(e) e_books from gardner_record r
left join gardner_e_book_record e on r.ean_number = e.physical_edition_ean
group by r.id

这按预期工作。我得到了结果,但我还需要从另一个具有一对一关系的表 gardner_inventory_item

添加到 gardner_record 的列

这是我试过的:

select book.*, array_agg(e) e_books from (
    select  r.*,
           i.price,
           i.discount,
           i.free_stock,
           i.report,
           i.report_date
    from gardner_record r
             inner join gardner_inventory_item i on r.ean_number = i.ean
    ) book
left join gardner_e_book_record e on book.ean_number = e.physical_edition_ean
group by book.id

但它不起作用。查询给出错误,指出 modified_date(gardner_record 上的一列)需要分组或聚合。

这是为什么?我在子查询中创建了一个表。然后我将嵌套记录作为 ebooks 加入,并在 select 中使用 array_agg()。这不应该意味着它全部聚合了吗?它适用于第一个查询。

我在这里缺少什么概念?

最佳答案

一般而言,任何未出现在聚合函数中的列都必须包含在 GROUP BY 子句中,但是如果所选表具有主键,则只需将主键包含在 GROUP BY 子句允许在没有聚合的情况下选择该表的所有列,您在第一个查询中使用了聚合。然而这种方法does not work when the primary key is wrapped in a subquery因为 Postgres 优化器无法判断该列最初是主键。

要解决这个问题,您可以显式列出 book 子查询的所有列(这可能很麻烦)。

或者,您可以在子查询中连接和分组 gardner_recordgardner_e_book_record 表,然后连接 gardner_inventory_item。基本上只是将您的第一个查询作为子查询,然后加入 gardner_inventory_item 表。示例:

select book_e_ebooks, i.* from (
        select r.*, array_agg(e) e_books from gardner_record r
        left join gardner_e_book_record e on r.ean_number = e.physical_edition_ean
        group by r.id
    ) book_e_ebooks
left join gardner_inventory_item i on book_e_ebooks.ean_number = i.ean;

但是你真的根本不需要子查询:

select r.*, i.*, array_agg(e) e_books from gardner_record r
left join gardner_inventory_item i on r.ean_number = i.ean
left join gardner_e_book_record e on r.ean_number = e.physical_edition_ean
group by r.id, i.id

关于sql - 为什么这个查询需要聚合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56829290/

相关文章:

mysql - 在表的所有行中查找具有空值的列

python - 当我更新的属性是用户输入时,如何编写更新语句?

c# - 独立于 DBMS 的查询

php - MySQL选择有和没有关系的行

objective-c - 我如何构建这个 SUBQUERY NSPredicate?

mysql - 上传和导入非常大的数据文件(CSV)时在所有列中添加“

mysql - 使用 Mysql Mysiam 表选择增量内最常访问的位置

python - Mac 上的错误 : No module named psycopg2. 扩展

sql - 在 postgresql 中将组合插入到表中的更快方法

java - 从 Android 进行更好的 sqlite 查询