gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:26:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com