You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM中JSONB列用DISTINCT ON报错:缺失FROM子句条目

错误原因解析

missing FROM-clause entry for table "activitylogentry" 这个错误是说你的查询语句里,SELECT部分引用了名为activitylogentry的表/别名,但FROM子句里根本没有这个名称的条目。问题出在PostgreSQL对标识符的大小写处理:

  • 当你用createQueryBuilder('activityLogEntry')时,TypeORM生成的SQL中,FROM子句的别名会被PostgreSQL自动转成全小写的activitylogentry(未加引号的标识符会被强制转为小写)。
  • 但你在SELECT语句里写的是activityLogEntry.*和activityLogEntry->'source'->>'item_id',这里的activityLogEntry是驼峰格式,PostgreSQL会把它当成和activitylogentry完全不同的标识符,自然找不到对应的表别名。

解决方法

要让别名匹配,有两种可行方式:

  1. 给驼峰别名加双引号:在SELECT语句里引用别名时,用双引号包裹以保留大小写:
const boxPreviewActivities = await this.activityLogEntryRepository
  .createQueryBuilder('activityLogEntry')
  .select(
    `DISTINCT ON (itemId) "activityLogEntry".*, "activityLogEntry"."originalData"->'source'->>'item_id' as itemId`
  )
  1. 统一用小写别名:把QueryBuilder的别名改成全小写,SELECT里也对应使用小写:
const boxPreviewActivities = await this.activityLogEntryRepository
  .createQueryBuilder('activitylogentry')
  .select(
    `DISTINCT ON (itemId) activitylogentry.*, activitylogentry."originalData"->'source'->>'item_id' as itemId`
  )

关于DISTINCT的使用

你用的DISTINCT ON是PostgreSQL特有的语法,这个用法是正确的——它会针对指定的itemId字段去重,返回每个itemId对应的第一行数据。注意:如果没有指定ORDER BY,返回的“第一行”是不确定的,建议加上排序逻辑保证结果稳定,比如:

.select(...)
.orderBy('itemId')

内容的提问来源于stack exchange,提问作者sayinmehmet47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:35:54