我正在使用 Postgres,并且想对特定行号进行表连接。
我有以下内容:
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
为了尝试只获取第一行。 (我还需要获取第 2 行和第 3 行,但首先只想让第 1 行正常工作)。
但是,上面的查询给出了以下错误:
SQL 错误 [42601]:错误:“select”位置或附近的语法错误: 7102
更多信息:
如果我运行以下命令:
select
*
from
(
select
row_number() over(
order by
id
) as tas_row_num
from
trip_approver_snapshot
) tasn
where
tasn.tas_row_num = 1
您正在尝试分页。你所展示的想法在语法上是错误的,但即使你解决了这个问题,它的逻辑仍然不太正确。
如果您的目标是仅使用
trip_approver_snapshot
中的第一行,则可以使用 lateral
子查询 替换该表,仅从中获取该行:
LEFT JOIN LATERAL (SELECT * FROM rip_approver_snapshot AS tas
WHERE trip.trip_id=tas.trip_id
ORDER BY tas.id LIMIT 1 OFFSET 0) tas
ON TRUE
要仅获取第二行,只需将
OFFSET
增加到 1
。要获得第 3 个,请将其增加到 2 个,依此类推。我链接的帖子讨论了基于LIMIT
/OFFSET
的分页作为一种直观但不是真正最佳的方法。
有更好的方法来构建此
join
,但最佳选择取决于您的表结构、索引以及完整查询的目标,但您没有透露这些。
现在,在您发布的第一个查询中,如果您从
trip_approver_snapshot
获取内容,它无法与其子查询中的编号副本相关联。你
trip_approver_snapshot
row_number()
之外,您没有选择任何内容)select *
)1
的那一个之外,其他都被丢弃了。所有这些都是
join
条件。 (select 1)
可以为您节省一些麻烦,让您获得包含 1
的单行。