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 无法整体优化查询(但这可能会改变)。在某些情况下,这可能是控制查询执行的有用方法,并且绝对是您应该考虑的事情。
执行查询并在事务中重用结果的另一种方法是使用临时表,如下所示:
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
)