WITH aux_results AS (
SELECT id
FROM vendors
)
SELECT c.id
FROM customers AS c
WHERE c.vendor IN (SELECT * FROM aux_results);
这是一个简单而简单的 CTE 示例。辅助语句使用 SELECT 来检索 id。要过滤它们,我必须使用 SELECT ,否则会引发异常。
为什么会这样,为什么它与使用子查询进行相同的整体查询的模式不同?
看:
https://www.postgresql.org/docs/current/functions-subquery.html#FUNCTIONS-SUBQUERY-IN
看起来子查询返回的对象与 CTE 辅助语句返回的对象不同。查询的方式不同,因此外部接口不同,但它们都可以被视为瞬态表。
顺便说一句,性能是否受到影响?(怀疑)我应该只使用子查询吗?(对此感到怀疑)
通常,
IN
对于此类查询来说不是最佳选择。它使 Postgres - 或任何与此相关的 RDBMS - (尝试)将集合中的重复项折叠到右侧。很可能,没有来自像 之类的查询的重复信息SELECT id FROM vendors
,那么这是浪费精力,而普通联接会更快。(您也会看到不同的查询计划。)从 Postgres 12 开始,无意义的 CTE 将被内联,并且几乎不会造成任何性能损失(规划阶段的一笔小费用)。看:
对于简单情况,子查询至少同样快或更快。也更短: