删除重复的数据,在平时的工作中还是会和碰到的,感觉挺有用,从网上摘录的,记在这里,以备需要时查阅

  1. --方法一,IN方式,适合2000/2005/2008,6728 毫秒
  2.  
  3. DELETE [student_L]
  4.  
  5. WHERE id NOT IN ( SELECT MAX(id)--min(id)
  6. FROM [student_L]
  7. GROUP BY [stuid], [stuname], [Birthday], [AreaOrganID] )
  8.  
  9. /*
  10.  
  11. SQL Server 分析和编译时间:
  12. CPU 时间= 20 毫秒,占用时间= 20 毫秒。
  13. 表'student_L'。扫描计数2001,逻辑读取30014 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
  14. 表'Worktable'。扫描计数1,逻辑读取2020 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
  15.  
  16. SQL Server 执行时间:
  17. CPU 时间= 6719 毫秒,占用时间= 6728 毫秒。
  18. (1000 行受影响)
  19.  
  20. */
  21.  
  22. --方法二,CTE方式,适合2005/2008,30 毫秒
  23. WITH dstudent
  24. AS (
  25. SELECT id,
  26. ROW_NUMBER() OVER ( PARTITION BY [stuid], [stuname],
  27. [Birthday], [AreaOrganID] ORDER BY GETDATE() ) pid
  28. FROM [student_L]
  29. )
  30.  
  31. DELETE dstudent
  32. WHERE id NOT IN ( SELECT id
  33. FROM dstudent
  34. WHERE pid = 1 )
  35.  
  36. /*
  37.  
  38. SQL Server 分析和编译时间:
  39. CPU 时间= 12 毫秒,占用时间= 12 毫秒。
  40. 表'student_L'。扫描计数4,逻辑读取2056 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
  41. 表'Worktable'。扫描计数1,逻辑读取2020 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
  42.  
  43. SQL Server 执行时间:
  44. CPU 时间= 32 毫秒,占用时间= 30 毫秒。
  45. (1000 行受影响)
  46. */
  47.  
  48. --方法三, LEFT JOIN方式,适合2000/2005/2008,7379 毫秒
  49.  
  50. DELETE stu
  51. FROM [student_L] stu
  52. LEFT JOIN (
  53. SELECT ID = MAX(id)
  54. FROM [student_L]
  55. GROUP BY [stuid], [stuname], [Birthday], [AreaOrganID]
  56. ) S ON stu.id = s.id
  57. WHERE s.id IS NULL
  58.  
  59. /*
  60.  
  61. SQL Server 分析和编译时间:
  62. CPU 时间= 10 毫秒,占用时间= 10 毫秒。
  63. 表'student_L'。扫描计数2001,逻辑读取30014 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
  64. 表'Worktable'。扫描计数0,逻辑读取0 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
  65.  
  66. SQL Server 执行时间:
  67. CPU 时间= 7375 毫秒,占用时间= 7379 毫秒。
  68. (1000 行受影响)
  69.  
  70. */
  71.  
  72. --方法四,游标方式, 适合2000/2005/2008,833毫秒
  73. DECLARE @d DATETIME
  74. SET @d = GETDATE()
  75.  
  76. --Script.Start
  77.  
  78. ---------------------------------------------------------------------------------------------
  79.  
  80. DECLARE @id INT
  81. DECLARE @stuid INT
  82. DECLARE @stuname VARCHAR(50)
  83. DECLARE @Birthday VARCHAR(10)
  84. DECLARE @AreaOrganID INT
  85. DECLARE @prestuid INT
  86. DECLARE @prestuname VARCHAR(50)
  87. DECLARE @preBirthday VARCHAR(10)
  88. DECLARE @preAreaOrganID INT
  89.  
  90. DECLARE cur CURSOR
  91.  
  92. FOR
  93. SELECT ID, [stuid], [stuname], [Birthday], [AreaOrganID]
  94. FROM [student_L]
  95. ORDER BY [stuid], [stuname], [Birthday], [AreaOrganID]
  96.  
  97. OPEN cur
  98. FETCH NEXT FROM cur INTO @id, @stuid, @stuname, @Birthday, @AreaOrganID
  99.  
  100. WHILE @@FETCH_STATUS = 0
  101. BEGIN
  102.  
  103. IF ( @stuid = @prestuid )
  104. AND ( @stuname = @prestuname )
  105. AND ( @Birthday = @preBirthday )
  106. AND ( @AreaOrganID = preAreaOrganID )
  107.  
  108. BEGIN
  109. DELETE [student_L]
  110. WHERE id = @id
  111. END
  112.  
  113. SELECT @prestuid = @stuid, @prestuname = @stuname,
  114. @preBirthday = @Birthday, @preAreaOrganID = @AreaOrganID
  115.  
  116. FETCH NEXT FROM cur INTO @id, @stuid, @stuname, @Birthday,
  117. @ArerOrganID
  118.  
  119. END
  120.  
  121. CLOSE cur
  122. DEALLOCATE cur
  123.  
  124. ---------------------------------------------------------------------------------------------
  125.  
  126. --Script.End
  127.  
  128. PRINT DATEDIFF(ms, @d, GETDATE())
  129.  
  130. --方法五,中间表方式, 适合/2005/2008 ,39 毫秒。
  131.  
  132. SELECT (
  133. SELECT TOP 1
  134. id
  135. FROM student_l a
  136. WHERE 1 = 1
  137. AND a.stuid = b.stuid
  138. AND a.[stuname] = b.[stuname]
  139. AND a.[Birthday] = b.[Birthday]
  140. AND a.[AreaOrganID] = b.[AreaOrganID]
  141. ) id, [stuid], [stuname], [Birthday], [AreaOrganID]
  142.  
  143. INTO student_l1
  144. FROM student_l b
  145. DROP TABLE student_l
  146.  
  147. EXEC sp_rename 'dbo.student_l1', 'student_l';
  148.  
  149. /*
  150.  
  151. SQL Server 分析和编译时间:
  152. CPU 时间= 0 毫秒,占用时间= 3 毫秒。
  153. 表'Worktable'。扫描计数2000,逻辑读取8067 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
  154. 表'student_l'。扫描计数2,逻辑读取22 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次
  155.  
  156. SQL Server 执行时间:
  157. CPU 时间= 31 毫秒,占用时间= 39 毫秒。
  158.  
  159. (2000 行受影响)
  160. */

MSSQLSERVER数据库- SQL删除重复数据的五种方式的更多相关文章

  1. sql 删除重复数据且保留其中一条 用sql 关键字:with ROW_NUMBER

    --1.建立表:Coursecreate table Course( ID int identity(1,1),--ID Student varchar(20) ,--学生 Sub varchar(2 ...

  2. Oracle 数据库表删除重复数据

    删除重复数据并保留一条 方法一 1.建立临时表,记录重复的数据 create table 临时表 as select a.字段1,a.字段2,max(a.rowid) as dataid from 原 ...

  3. Android数据存储五种方式总结

    本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据     2 文件存储数据       3 SQLite数据库存储数据 4 使用Cont ...

  4. oracle 批量删除表数据的4种方式

      1.情景展示 情景一: 删除PRIMARY_INDEX_TEST表中,MINDEX_ID字段为空的数据 情景二: 删除VIRTUAL_CARD_TEST表中的脏数据 2.解决方案 情景一的解决方案 ...

  5. sql删除重复数据思路

    总的思路就是先找出表中重复数据中的一条数据,插入临时表中,删除所有的重复数据,然后再将临时表中的数据插入表中.所以重点是如何找出重复数据中的一条数据,有三种情况 1.重复数据完全一样,使用distin ...

  6. 【转】SQL删除重复数据方法,留着备用

    感谢孙潇楠前辈的总结,地址http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id           name ...

  7. (转载)SQL删除重复数据方法

    本文转载自http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id           name         ...

  8. SQL删除重复数据方法

    例如: id           name         value 1               a                 pp 2               a           ...

  9. 【转】SQL删除重复数据方法

    例如: id           name         value 1               a                 pp 2               a           ...

随机推荐

  1. 两个基于C++/Qt的开源WEB框架

    1.tufao 项目地址: https://github.com/vinipsmaker/tufao 主页: http://vinipsmaker.github.io/tufao/ 介绍: Tufão ...

  2. LinkedList源代码深入剖析

    第1部分 LinkedList介绍LinkedList简介 public class LinkedList<E> extends AbstractSequentialList<E&g ...

  3. RedMine项目管理系统安装问题(Linux版一键安装包)

    安装环境 操作环境:VMware下安装的Parrot Security OS 系统 使用软件:bitnami-redmine---linux-x64-installer.run 问题描述: 安装步骤与 ...

  4. 关于hadoop的环境变量

    export PATH export JAVA_HOME=/opt/jdk1.7 export PATH=$PATH:$JAVA_HOME/bin 为什么/etc/profile 添加了环境变量had ...

  5. Java面试题-并发框架

    1. SynchronizedMap和ConcurrentHashMap有什么区别?  答:java5中新增了ConcurrentMap接口和它的一个实现类ConcurrentHashMap.Conc ...

  6. hdu4619Warm up 2

    http://acm.hdu.edu.cn/showproblem.php?pid=4619 二分图匹配  最小点覆盖 = 最大匹配 #include <iostream> #includ ...

  7. NOI2013矩阵游戏

    Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...

  8. 关闭 VS的实时调试器

    可以这样关闭: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger HKEY_LOCAL_ ...

  9. 如何在一个frame中调用另一个frame中的javascript函数

    1.htm <script language="javascript">function test(){alert("测试")}</scrip ...

  10. Spring Autowire自动装配介绍

    在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象.但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的< ...