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);
无论您真正想要完成什么,自加入似乎都有些过分了。这可能是正确的解决方案,但还有其他选择。
我正在使用 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);
无论您真正想要完成什么,自加入似乎都有些过分了。这可能是正确的解决方案,但还有其他选择。