CTE的妙用

转自:https://blog.csdn.net/kk185800961/article/details/42535223

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

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

【大表分批更新】

【大表分批删除】

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

[sql]  view plain  copy
 
  1. --创建测试表  
  2. --  DROP TABLE [tabName]  
  3. SELECT * INTO [tabName] FROM sys.objects  
  4.   
  5.   
  6. SELECT * FROM [databaseName].[dbo].[tabName] ORDER BY name desc  

[sql]  view plain  copy
 
    1. ---------------------------------------------------------------  
    2. ---------------------------------------------------------------  
    3.   
    4. 【大表分批更新】  
    5. 网页需要升级的时候,数据库需要增加字段或者更新字段值,对于大表将堵塞很久。  
    6. 一般先增加字段允许为null值,再更新表中默认值,再添加约束  
    7. 比如要将测试表的principal_id更新为0,以下用最简单的可行的方法更新:  
    8.   
    9. ;WITH TAB AS(  
    10.     SELECT TOP 10 principal_id FROM [dbo].[tabName] where principal_id is null  
    11. )update TAB set principal_id = 0  
    12.   
    13.   
    14. 要更新字段principal_id就只取一个。每次选择前10行更新null为0,可以创建定时作业更新。  
    15.   
    16. ---------------------------------------------------------------  
    17. ---------------------------------------------------------------  
    18.   
    19. 【大表分批删除】  
    20. 对于一些数据维护需要删除较多的数据,而表较大并且很多用户还在使用中。  
    21. 一般创建一个作业在晚上执行删除,或者按某个字段分段删除。  
    22. 更方便的方法也可以选择符合的条件删除前N行  
    23.   
    24. ;WITH TAB AS(  
    25.     SELECT TOP 10 principal_id FROM [dbo].[tabName] where principal_id is null  
    26. )DELETE FROM TAB  
    27.   
    28. ---------------------------------------------------------------  
    29. ---------------------------------------------------------------  
    30.   
    31. 【完全重复的行只保留一行】  
    32.   
    33. --插入使产生重复行  
    34. INSERT INTO [tabName]  
    35. SELECT TOP 50 PERCENT * FROM [databaseName].[dbo].[tabName]  
    36.   
    37.   
    38. SELECT * FROM [databaseName].[dbo].[tabName] ORDER BY name desc  
    39.   
    40.   
    41. 网上使用最多的案例,都指定某列肯定是唯一的,以此来用一个语句删除其他重复的。  
    42. 对于完全相同的行,大都表示创建一个临时表来过渡操作。  
    43. 以下使用“with 子句 和 ROW_NUMBER()函数”来实现删除完全重复的其他行  
    44. ,partition分组时可以选择一列(或所有列)进行分组排序  
    45.   
    46. ;WITH TAB AS(  
    47.     SELECT ROW_NUMBER()over(partition by object_id order by (select 0)) id  
    48.     FROM [dbo].[tabName]  
    49. )DELETE FROM TAB WHERE ID>1  

猜你喜欢

转载自www.cnblogs.com/gered/p/9087109.html