• 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  
  • 相关阅读:
    php与nginx配置,不能运行php程序
    奇葩php之数组
    奇葩之mysql
    for语法研究
    php short tag不显示排查
    奇葩之mysql【三】我只想获得一个自增Id,我容易吗我
    男女不同
    Restart explorer
    iOS面试贴士
    phpmyadmin万能登陆密码
  • 原文地址:https://www.cnblogs.com/gered/p/9087109.html
Copyright © 2020-2023  润新知