关于CTE的困惑

时间:2016-02-10 09:35:00

标签: sql sql-server

我一直在使用CTE,但我对CTE如何工作有疑问。

  1. CTE每次查询执行一次还是每行执行一次? (意味着它将先执行,然后将结果传递给下半部分,或者执行一行并传递给查询的下半部分)

  2. 我们知道CTE是在内存中执行的,当我们在同一个查询中使用相同的CTE两次时会发生什么?是它会从内存中使用相同的结果还是会再次计算它?

1 个答案:

答案 0 :(得分:1)

CTE主要是为了让我们的查询结构化,以提高可读性。

此查询:

with blue_items as (select * from items where color = 'blue')
   , lightblue_items as (select * from blue_items where tone = 'pale')
select *
from lightblue_items;

相同
select *
from (select * from (select * from items where color = 'blue') where tone = 'pale');

只有不同的写法。由DBMS决定如何执行它。它甚至可以在内部重新编写查询

select * from items where color = 'blue' and tone = 'pale';

与自我加入相同。 DBMS如何执行以下查询再次由DBMS决定。它将尝试找到最佳执行计划,可能意味着两次读取表以读取它一次并在内存中对其进行操作。

with cte as (select * from persons)
select *
from cte p1
join cte p2 on p2.personid <> p1.personid;
不要为此担心。编写您的查询,以便您发现它们可读并依赖DBMS正确完成其工作并找到最佳执行方法。