关于CTE的使用,以及TOP/ORDER BY的执行顺序

本篇博文主要针对于SQL Sever遇到的类似问题。
CTE公用表达式,相当于建一个临时表,用with as语句,给as中的临时表起一个别名。但是在CTE的使用中出现了一些问题。
example:

with c as( 
    select top 100 * from TestTable 
) 
select * from c order by CreateTime desc
with c as(
    select top 100 * from TestTable
    order by CreateTime desc
)
select * from c
select top 100 * from TestTable
order by CreateTime desc

这三个例子很容易搞混,1和3会按照CreateTime降序排列,但是2不会做任何操作。

原理如下:
关于CTE的使用,以及TOP/ORDER BY的执行顺序_第1张图片
不难看出,TOP操作的执行在ORDER BY之后,所以当使用CTE时候,将order by写在CTE才能实现先排序,再取数据。

with c as( 
    select top 100 * from TestTable 
) 
select * from c 
join TestTable as b on c.Id = b.Id 
order by b.CreateTime desc

上面这个例子就是和例1相反的,先取前100条数据之后再排序。

至于为什么这么写的具体原因,我还没有吃透,如果有读者看到,麻烦点拨一下,互相学习!

你可能感兴趣的:(SQL)