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

enter image description here

更多信息:

如果我运行以下命令:

select 
  * 
from 
  (
    select 
      row_number() over(
        order by 
          id
      ) as tas_row_num 
    from 
      trip_approver_snapshot
  ) tasn 
where 
  tasn.tas_row_num = 1

enter image description here

推荐答案

你在try paginate.你展示的 idea 在语法上是错误的,但即使你修正了它,它的逻辑仍然不太正确.

如果您的目标是只使用trip_approver_snapshot中的第一行,则可以用lateral subquery替换该表,只取其中的那一行:

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即可.为了得到第三个,将它提高到2,以此类推.post I linked讨论了基于LIMIT/OFFSET的分页,认为这是一种直观但并不是真正最佳的方法.

构建这join有更好的方法,但最佳 Select 取决于您的表 struct 、索引和完整查询的目标,您没有透露这些内容.


现在,在您发布的第一个查询中,如果从trip_approver_snapshot中提取内容,它将无法与子查询中的编号副本相关联.你

  1. trip_approver_snapshot行开始
  2. 擦除了它们的内容(除了row_number()之外,您没有 Select 任何内容)
  3. 想要这一切(select *)
  4. 除了数字为1的那个,其他的都丢弃了.

所有这些都是join的条件.(select 1)将为您省go 在一行中包含1的麻烦.

Sql相关问答推荐

如何计算帐户在SQL中随着时间的推移购买的SKU数量?

获取家谱树中第一次出现的特定信息,然后停止

PostgreSQL:获取每家店铺收入最高的员工

表名数组

Select /过滤postgr中的树 struct

GROUP BY和GROUP_CONCAT用于计算比赛排名

JSON列之间的Postgr聚合

无效和不匹配的计数

MariaDB查询在逗号分隔的字符串中查找多个值

通过之前的连接-这是Oracle的错误吗?

如何计算一个用户S的日常连胜?

在SQL中为两个日期之间的每个日期添加行

Oracle中的时间戳

在PostgreSQL中汇总连接表中的 case 值

如何在Postgres中为单值输入多行?

在Power Bi中将SQL代码转换为DAX

替换SQL Server XML中多处出现的 node 值

一次 Select 语句中按组累计的SQL累计数

以 15 分钟为间隔的使用情况SQL 查询

基于源表的 SQL INSERT、UPDATE 和 DELETE