之前在2本书看到过with as 子句的一个简单例子,网上没找到相关资料。
今天想起总结一下,主要说明如下:
【大表分批更新】
【大表分批删除】
【完全重复的行只保留一行】
--创建测试表-- DROP TABLE [tabName]SELECT * INTO [tabName] FROM sys.objectsSELECT * 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------------------------------------------------------------------------------------------------------------------------------