Имя 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
)