使用单个SQL相关子查询来获取两列

Jul*_*F-C 6 sql postgresql indexing performance correlated-subquery

我的问题由以下查询表示:

SELECT 
  b.row_id, b.x, b.y, b.something,
  (SELECT a.x FROM my_table a WHERE a.row_id = (b.row_id - 1), a.something != 42 ) AS source_x,
  (SELECT a.y FROM my_table a WHERE a.row_id = (b.row_id - 1), a.something != 42 ) AS source_y
FROM 
  my_table b
Run Code Online (Sandbox Code Playgroud)

我使用相同的子查询语句两次,以获得两者source_xsource_y.这就是为什么我想知道是否可以只使用一个子查询来做到这一点?

因为一旦我对我的真实数据(数百万行)运行此查询,它似乎永远不会完成并花费数小时,如果不是几天(我的连接在结束前挂起).

我正在使用PostgreSQL 8.4

Dav*_*dEG 8

我想你可以使用这种方法:

SELECT b.row_id
     , b.x
     , b.y
     , b.something
     , a.x
     , a.y
  FROM my_table b
  left join my_table a on a.row_id = (b.row_id - 1)
                      and a.something != 42
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 3

@DavidEG 发布了查询的最佳语法。

然而,你的问题绝对不仅仅是查询技术。使用一个JOIN子查询而不是两个子查询最多可以将速度加快两倍。很可能更少。这并不能解释“小时”。即使有数百万行,设置得当的 Postgres 也应该在几秒钟而不是几小时内完成简单的查询。