WITH aux_results AS (
SELECT id
FROM vendors
)
SELECT c.id
FROM customers AS c
WHERE c.vendor IN (SELECT * FROM aux_results);
Aqui está um exemplo ingênuo e simples de um CTE. A instrução auxiliar usa SELECT para recuperar ids. Para filtrá-los, tenho que usar SELECT ou uma exceção é lançada.
Por que isso é um padrão diferente de usar uma subconsulta para fazer a mesma consulta geral?
Ver:
https://www.postgresql.org/docs/current/functions-subquery.html#FUNCTIONS-SUBQUERY-IN
Parece que o objeto retornado por uma subconsulta é diferente do objeto retornado pela instrução auxiliar CTE. A maneira como você deve consultar é diferente, portanto a interface externa é diferente, mas ambas podem ser consideradas tabelas transitórias.
Como um aparte, há algum impacto no desempenho? (duvido) Devo usar apenas uma subconsulta? (duvido)
Normalmente,
IN
é abaixo do ideal para esse tipo de consulta. Isso faz com que o Postgres - ou qualquer RDBMS - (tente) dobrar duplicatas no conjunto à direita. As chances são de que não haja dupes vindo de uma consulta comoSELECT id FROM vendors
, então isso é um esforço desperdiçado e uma junção simples será mais rápida. (Você também verá um plano de consulta diferente.)Desde o Postgres 12, um CTE inútil será embutido e dificilmente incorrerá em qualquer penalidade de desempenho (uma pequena despesa no estágio de planejamento). Ver:
Uma subconsulta é pelo menos tão rápida ou mais rápida para casos simples. Mais curto também: