PostgreSQL按指定行号关联表遇语法错误,求正确实现方案
PostgreSQL按指定行号关联表的语法错误解决
你编写的LEFT JOIN语句存在语法错误,直接在ON子句里嵌套完整SELECT查询不符合SQL规范,导致报错。
错误的SQL语句
LEFT JOIN trip_approver_snapshot tas ON trip.trip_id=tas.trip_id and select * from (select row_number() over(order by id) as tas_row_num from trip_approver_snapshot) tasn where tasn.tas_row_num = 1
报错信息
SQL Error [42601]: ERROR: syntax error at or near "select" Position: 7102
问题分析
JOIN的ON子句只能用于定义表之间的关联条件(逻辑表达式),不能直接嵌入完整的SELECT查询语句。你单独执行的子查询本身是合法的,但放到ON子句里就违反了语法规则。
另外,你原来的子查询是全局生成行号,没有按trip_id分区,这样取到的是整个表的第1行,不是每个trip对应的第1行审批快照,这也不符合你的关联需求。
正确的写法
要实现每个trip关联其对应的第N行审批快照,需要先按trip_id分区生成行号,再进行关联:
LEFT JOIN ( SELECT *, -- 按trip_id分区,每个trip下的行按id排序生成行号 row_number() over(PARTITION BY trip_id ORDER BY id) as tas_row_num FROM trip_approver_snapshot ) tas ON trip.trip_id = tas.trip_id AND tas.tas_row_num = 1
- 如果要关联第2行,只需把
tas.tas_row_num = 1改为tas.tas_row_num = 2 - 同理,第3行改为
=3即可
补充说明
你单独执行的子查询可以正常运行,但它是全局生成行号,取的是整个trip_approver_snapshot表的第1行,而非每个trip对应的行。调整后的子查询加入PARTITION BY trip_id后,才能满足按trip关联指定行号的需求。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

