以下是我的两个不同查询执行的示例,其中包含相同的结果
使用内部选择选择查询。
select p.product from
(
select * from tbl_a where productid not in (select productid from tbl_b)
) p
order by p.product
使用 CTE 选择查询。
with cte as
(
select * from tbl_a where productid not in (select productid from tbl_b)
)
select product from cte order by product
答案 0 :(得分:1)
Postgres始终实现CTE,这意味着CTE版本具有读取和写入数据的额外开销。 (注意:在其他数据库中不一定如此。)Postgres不(必然)实现子查询,因此版本应该更快。
编写此查询的更好方法是完全省略子查询/ CTE:
select a.product
from tbl_a a
where a.productid not in (select productid from tbl_b)
order by a.product;
(我忽略not exists
或left outer join
实际上是否会优于not in
。)
在编写查询时,没有使用CTE而不是子查询的一般规则。这取决于很多因素,特别是基础表是否被索引以及CTE在查询中出现的次数。