我正在尝试将 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_record
和 gardner_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/