JOIN 特定行号[重复]

问题描述 投票:0回答:1

我正在使用 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

sql postgresql row-number
1个回答
0
投票

您正在尝试分页。你所展示的想法在语法上是错误的,但即使你解决了这个问题,它的逻辑仍然不太正确。

如果您的目标是仅使用

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
获取内容,它无法与其子查询中的编号副本相关联。你

  1. trip_approver_snapshot
  2. 获取行
  3. 擦除了它们的内容(除了
    row_number()
    之外,您没有选择任何内容)
  4. 要求所有这些(
    select *
  5. 除了带有数字
    1
    的那一个之外,其他都被丢弃了。

所有这些都是

join
条件。
(select 1)
可以为您节省一些麻烦,让您获得包含
1
的单行。

© www.soinside.com 2019 - 2024. All rights reserved.