关于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不会做任何操作。

原理如下:

不难看出,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条数据之后再排序。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值