gpt4 book ai didi

postgresql - 在 PostgreSQL 中结合 CTE 和 IN

转载 作者:行者123 更新时间:2023-11-29 13:13:09 26 4
gpt4 key购买 nike

所以我在 PostgreSQL 10 中有这个简单的查询。

with bunch_of_things as (
select vans_id from shoes where adidas_id = 1
)

select * from vans where vans.id in (bunch_of_things) ;

我收到错误消息 column "bunch_of_things"does not exist

我知道我可以将第一个选择放在第二个查询的括号内,以定义 IN 部分

但是由于我会在同一事务中多次使用第一次查询的结果,所以我不想多次执行相同的查询。

那么我怎样才能使 IN 与 CTE 一起工作呢?

(如果这不可能,我怎样才能获得一次查询的结果并在事务中多次使用它们?)

谢谢

最佳答案

CTE 的名称就像一个表,因此您应该进行选择

with bunch_of_things as (
select vans_id from shoes where adidas_id = 1
)

select * from vans where vans.id in (select vans_id from bunch_of_things);

但是您需要考虑几件事。

首先,EXISTS 通常比 IN 性能更好

with bunch_of_things as (
select vans_id from shoes where adidas_id = 1
)
select *
from vans v
where EXISTS (
select 1
from bunch_of_things b
where b.vans_id = v.id
)

其次,在 postgres 10 及以下版本中,CTE 是一个性能障碍,因此 postgres 无法优化整个查询(但是这 might 更改)。在某些情况下,这可能是控制查询执行的有用方法,并且绝对是您应该考虑的事情。

执行查询并在事务中重用结果的另一种方法是使用这样的临时表:

CREATE TEMPORARY TABLE bunch_of_things (vans_id integer)
ON COMMIT DROP;

INSERT INTO bunch_of_things (vans_id)
SELECT vans_id FROM shoes where adidas_id = 1;

然后照常使用表格:

select * 
from vans v
where EXISTS (
select 1
from bunch_of_things b
where b.vans_id = v.id
)

关于postgresql - 在 PostgreSQL 中结合 CTE 和 IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52227304/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com