所以我在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中,CTE是一个优化范围。
你会想要这样的东西,
SELECT *
FROM vans
WHERE EXISTS (
SELECT
FROM shoes
WHERE adidas_id = 1
AND vans_id = vans.id
)
那会更快。