【个人学习笔记9之--TOP 和APPLY 】

本文详细介绍了SQL中的TOP与APPLY操作。TOP与ORDER BY结合使用,可以控制返回的行数,而在SQL2005以后,TOP支持更多用法,包括在INSERT、UPDATE、DELETE中。WITH TIES选项允许返回与最后返回行相同值的额外行。APPLY是一个表运算符,先计算左边的表表达式。TOP与APPLY结合能解决返回每组前N行和匹配当前值与前一个值等问题。文章还讨论了分批删除和更新数据的策略,以及随机行选择和找到数据集的中间值的方法。
摘要由CSDN通过智能技术生成

 这篇来说说TOP 和APPLY


1.TOP
一般来说 我们的TOP 和 ORDER BY 是一起连用的 这样可以返回确定的行 你可以看做是一个筛选器,可以再表表达式中使用。
SQL 2005 TOP 后面支持连接 变量 算术表达式 子查询结果.
在2000里 只支持后面具体数字 如果想在2000中使用类似TOP (@n)的功能 参考http://blog.csdn.net/feixianxxx/archive/2009/08/03/4405684.aspx


这里有个小知识点: WITH TIES 。
create table # (a int)
insert # select
1 union all select
2 union all select
2 union all select
3 union all select
3 union all select
5
select top (4) A from # order by a
/*
A
-----------
1
2
2
3
*/
select top (4) with ties A from # order by a
/*
A
-----------
1
2
2
3
3
*/
--使用了WITH TIES 后 将生成额外的行,多出来的行是与最后返回行相同的值 例子里是3
SQL2005支持TOP出现在INSERT UPDATE DELETE 后面 控制操作的行数,比如 insert top(10) into tb select * from .....
不过可惜ORDER BY不能用于这些结构中,这样你也许会觉得无法控制。倒是有方法可以控制:
插入:insert tb select top (n) * from .... order by ....
删除:with cte as
(
 select top(10) * from ... order by ...
)
delete from  cte
修改: with cte as
(
 select top(10) * from ... order by ...
)
update cte set ......


实际小问题:
工作中有时候需要清理历史数据的时候,往往数据量达到了几百万.这个时候采用一次性删除的方法是很不明智的:
a.delete操作会被完整记录到日志里,它需要大量空间和时间;
b.如果删除中间发生中断,一切删除会回滚(在一个事务里);
c.同时删除多行,记录上的锁也许会被提升为排它表锁,从而阻碍操作完成之前有对这个表的操作(有时候会妨碍正常的业务
)
所以一般采取分批删除的方法.


sql2000:通过set rowcount 来控制每次删除的记录数
SET ROWCOUNT 5000;
WHILE 1 = 1
BEGIN
  DELETE FROM dbo.LargeOrders
  WHERE OrderDate < '19970101';

  IF @@

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值