本篇博文主要针对于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不会做任何操作。
原理如下:
不难看出,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条数据之后再排序。
至于为什么这么写的具体原因,我还没有吃透,如果有读者看到,麻烦点拨一下,互相学习!