gpt4 book ai didi

sql - TypeORM:列必须出现在 GROUP BY 子句中或在聚合函数中使用

转载 作者:行者123 更新时间:2023-12-03 08:01:29 25 4
gpt4 key购买 nike

我试图弄清楚为什么以下原始 SQL 可以与 PostGres 完美配合,而通过 TypeORM 生成的 SQL 则不能。

运行此工程:

SELECT symbol, MAX(created_at) AS created_at
FROM update_history
WHERE exchange = 'NYSE'
AND data_type = 'companyRecord'
GROUP BY symbol
ORDER BY created_at ASC

示例:https://dbfiddle.uk/yocl-rBq

然而,TypeORM sql 由以下内容生成:

const result = this.repository
.createQueryBuilder('h1')
.select(['MAX(h1.createdAt) AS created_at', 'h1.symbol'])
.where('h1.exchange = :exchange', { exchange })
.andWhere('h1.dataType = :dataType', { dataType })
.groupBy('h1.symbol')
.orderBy({ created_at: 'ASC' })
.take(limit)
.getMany();

/* Produces this:

SELECT "h1"."symbol" AS "h1_symbol",
MAX("h1"."created_at") AS created_at
FROM "update_history" "h1"
WHERE "h1"."exchange" = 'NYSE'
AND "h1"."data_type" = 'companyRecord'
GROUP BY "h1"."symbol"
ORDER BY created_at ASC LIMIT 5000
*/

示例(第二个选择框):https://dbfiddle.uk/yocl-rBq

返回以下错误:

QueryFailedError: column "h1.id" must appear in the GROUP BY clause or be used in an aggregate function

如果我将 h1.id 添加到 GROUP BY 子句,查询将不再返回正确的结果集,因为它实际上是不同的。

正如您从 DBFiddle 链接中看到的,两个生成的 SQL 查询都在 TypeORM 之外工作。

我在这里缺少什么?

最佳答案

您使用的 getMany() 始终会在 select 中添加 id 字段。您粘贴的查询很可能在添加 getMany() 之前已被记录。尝试在 ormconfig.js 中设置 logging: true,您将看到正在触发的确切查询。

您应该使用getRawMany(),您将能够获得准确的查询以及所需的结果。

关于sql - TypeORM:列必须出现在 GROUP BY 子句中或在聚合函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73937450/

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