Postgressql:如何从 sql 结果中 select 两次

Postgresql: How to select from the sql results twice

我正在使用 PostgreSQL 从相同的 sql 结果中将 SQL 查询写入 select 两次。例如,

SELECT a.id, b.id
  FROM
    (SELECT * FROM tableA) as a,
    (SELECT * FROM tableA) as b
  WHERE a.id = b.id+1

如您所见,以下 SQL 查询已执行两次:

SELECT * FROM tableA

是否可以临时存储 SQL 结果而不是 运行 两次相同的查询,因为此查询可能很复杂?

常用Table表达式:

with cte as 
(SELECT * FROM tableA)
select * from cte where...

因此您不必将相同的内容写两次。虽然不知道它是执行一次还是多次...

您可以使用 cte.

with a as (select * from tableA)
, b as (select * from tableA)
select a.id, b.id 
from a join b on a.id = b.id+1

或者可以用 self-join 来完成。

select a.id, b.id 
from tableA a join tableB b
on a.id = b.id+1

CTE 解决您的问题。但很可能 lead() 函数也可以。 . .并且性能更好:

SELECT a.*
FROM (SELECT a.id, lead(a.id) over (order by a.id) as b_id
      FROM tableA a
     ) a
WHERE id = b_id;

或者,对于可以处理重复项的内容:

SELECT a.id, a.id + 1
FROM tableA a
WHERE EXISTS (SELECT 1 FROM tableA a2 WHERE a2.id = a.id + 1);

无论您真正想要完成什么,自加入似乎都有些过分了。这可能是正确的解决方案,但还有其他选择。