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

jhd*_*vuk 2 sql postgresql node.js typeorm

我试图弄清楚为什么以下原始 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
Run Code Online (Sandbox Code Playgroud)

示例: 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
*/
Run Code Online (Sandbox Code Playgroud)

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

返回以下错误:

QueryFailedError:列“h1.id”必须出现在 GROUP BY 子句中或在聚合函数中使用

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

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

我在这里缺少什么?

Rah*_*rma 5

您正在使用getMany()它总是idselect. 您粘贴的查询很可能在添加之前已被记录getMany()。尝试logging: true在您的设置中进行设置ormconfig.js,您将看到正在触发的确切查询。

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