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完全不同的标识符,自然找不到对应的表别名。
解决方法
要让别名匹配,有两种可行方式:
- 给驼峰别名加双引号:在SELECT语句里引用别名时,用双引号包裹以保留大小写:
const boxPreviewActivities = await this.activityLogEntryRepository .createQueryBuilder('activityLogEntry') .select( `DISTINCT ON (itemId) "activityLogEntry".*, "activityLogEntry"."originalData"->'source'->>'item_id' as itemId` )
- 统一用小写别名:把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
相关产品推荐
相关产品推荐

