T-SQL查询:CTE - with as 子句的特殊应用

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/kk185800961/article/details/42535223

之前在2本书看到过with as 子句的一个简单例子,网上没找到相关资料。

今天想起总结一下,主要说明如下:

【大表分批更新】

【大表分批删除】

【完全重复的行只保留一行】


 
--创建测试表
--	DROP TABLE [tabName]
SELECT * INTO [tabName] FROM sys.objects
 
 
SELECT * FROM [databaseName].[dbo].[tabName] ORDER BY name desc

【大表分批更新】
网页需要升级的时候,数据库需要增加字段或者更新字段值,对于大表将堵塞很久。
一般先增加字段允许为null值,再更新表中默认值,再添加约束
比如要将测试表的principal_id更新为0,以下用最简单的可行的方法更新:

;WITH TAB AS(
	SELECT TOP 10 principal_id FROM [dbo].[tabName] where principal_id is null
)update TAB set principal_id = 0

要更新字段principal_id就只取一个。每次选择前10行更新null为0,可以创建定时作业更新。



【大表分批删除】
对于一些数据维护需要删除较多的数据,而表较大并且很多用户还在使用中。
一般创建一个作业在晚上执行删除,或者按某个字段分段删除。
更方便的方法也可以选择符合的条件删除前N行

;WITH TAB AS(
	SELECT TOP 10 principal_id FROM [dbo].[tabName] where principal_id is null
)DELETE FROM TAB


【完全重复的行只保留一行】

–插入使产生重复行

INSERT INTO [tabName]
SELECT TOP 50 PERCENT * FROM [databaseName].[dbo].[tabName]
 
 
SELECT * FROM [databaseName].[dbo].[tabName] ORDER BY name desc

网上使用最多的案例,都指定某列肯定是唯一的,以此来用一个语句删除其他重复的。
对于完全相同的行,大都表示创建一个临时表来过渡操作。
以下使用“with 子句 和 ROW_NUMBER()函数”来实现删除完全重复的其他行
,partition分组时可以选择一列(或所有列)进行分组排序

;WITH TAB AS(
	SELECT ROW_NUMBER()over(partition by object_id order by (select 0)) id
	FROM [dbo].[tabName]
)DELETE FROM TAB WHERE ID>1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值