MSSQLSERVER数据库- SQL删除重复数据的五种方式
删除重复的数据,在平时的工作中还是会和碰到的,感觉挺有用,从网上摘录的,记在这里,以备需要时查阅
- --方法一,IN方式,适合2000/2005/2008,6728 毫秒
- DELETE [student_L]
- WHERE id NOT IN ( SELECT MAX(id)--min(id)
- FROM [student_L]
- GROUP BY [stuid], [stuname], [Birthday], [AreaOrganID] )
- /*
- SQL Server 分析和编译时间:
- CPU 时间= 20 毫秒,占用时间= 20 毫秒。
- 表'student_L'。扫描计数2001,逻辑读取30014 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
- 表'Worktable'。扫描计数1,逻辑读取2020 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
- SQL Server 执行时间:
- CPU 时间= 6719 毫秒,占用时间= 6728 毫秒。
- (1000 行受影响)
- */
- --方法二,CTE方式,适合2005/2008,30 毫秒
- WITH dstudent
- AS (
- SELECT id,
- ROW_NUMBER() OVER ( PARTITION BY [stuid], [stuname],
- [Birthday], [AreaOrganID] ORDER BY GETDATE() ) pid
- FROM [student_L]
- )
- DELETE dstudent
- WHERE id NOT IN ( SELECT id
- FROM dstudent
- WHERE pid = 1 )
- /*
- SQL Server 分析和编译时间:
- CPU 时间= 12 毫秒,占用时间= 12 毫秒。
- 表'student_L'。扫描计数4,逻辑读取2056 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
- 表'Worktable'。扫描计数1,逻辑读取2020 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
- SQL Server 执行时间:
- CPU 时间= 32 毫秒,占用时间= 30 毫秒。
- (1000 行受影响)
- */
- --方法三, LEFT JOIN方式,适合2000/2005/2008,7379 毫秒
- DELETE stu
- FROM [student_L] stu
- LEFT JOIN (
- SELECT ID = MAX(id)
- FROM [student_L]
- GROUP BY [stuid], [stuname], [Birthday], [AreaOrganID]
- ) S ON stu.id = s.id
- WHERE s.id IS NULL
- /*
- SQL Server 分析和编译时间:
- CPU 时间= 10 毫秒,占用时间= 10 毫秒。
- 表'student_L'。扫描计数2001,逻辑读取30014 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
- 表'Worktable'。扫描计数0,逻辑读取0 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
- SQL Server 执行时间:
- CPU 时间= 7375 毫秒,占用时间= 7379 毫秒。
- (1000 行受影响)
- */
- --方法四,游标方式, 适合2000/2005/2008,833毫秒
- DECLARE @d DATETIME
- SET @d = GETDATE()
- --Script.Start
- ---------------------------------------------------------------------------------------------
- DECLARE @id INT
- DECLARE @stuid INT
- DECLARE @stuname VARCHAR(50)
- DECLARE @Birthday VARCHAR(10)
- DECLARE @AreaOrganID INT
- DECLARE @prestuid INT
- DECLARE @prestuname VARCHAR(50)
- DECLARE @preBirthday VARCHAR(10)
- DECLARE @preAreaOrganID INT
- DECLARE cur CURSOR
- FOR
- SELECT ID, [stuid], [stuname], [Birthday], [AreaOrganID]
- FROM [student_L]
- ORDER BY [stuid], [stuname], [Birthday], [AreaOrganID]
- OPEN cur
- FETCH NEXT FROM cur INTO @id, @stuid, @stuname, @Birthday, @AreaOrganID
- WHILE @@FETCH_STATUS = 0
- BEGIN
- IF ( @stuid = @prestuid )
- AND ( @stuname = @prestuname )
- AND ( @Birthday = @preBirthday )
- AND ( @AreaOrganID = preAreaOrganID )
- BEGIN
- DELETE [student_L]
- WHERE id = @id
- END
- SELECT @prestuid = @stuid, @prestuname = @stuname,
- @preBirthday = @Birthday, @preAreaOrganID = @AreaOrganID
- FETCH NEXT FROM cur INTO @id, @stuid, @stuname, @Birthday,
- @ArerOrganID
- END
- CLOSE cur
- DEALLOCATE cur
- ---------------------------------------------------------------------------------------------
- --Script.End
- PRINT DATEDIFF(ms, @d, GETDATE())
- --方法五,中间表方式, 适合/2005/2008 ,39 毫秒。
- SELECT (
- SELECT TOP 1
- id
- FROM student_l a
- WHERE 1 = 1
- AND a.stuid = b.stuid
- AND a.[stuname] = b.[stuname]
- AND a.[Birthday] = b.[Birthday]
- AND a.[AreaOrganID] = b.[AreaOrganID]
- ) id, [stuid], [stuname], [Birthday], [AreaOrganID]
- INTO student_l1
- FROM student_l b
- DROP TABLE student_l
- EXEC sp_rename 'dbo.student_l1', 'student_l';
- /*
- SQL Server 分析和编译时间:
- CPU 时间= 0 毫秒,占用时间= 3 毫秒。
- 表'Worktable'。扫描计数2000,逻辑读取8067 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
- 表'student_l'。扫描计数2,逻辑读取22 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次
- SQL Server 执行时间:
- CPU 时间= 31 毫秒,占用时间= 39 毫秒。
- (2000 行受影响)
- */
MSSQLSERVER数据库- SQL删除重复数据的五种方式的更多相关文章
- sql 删除重复数据且保留其中一条 用sql 关键字:with ROW_NUMBER
--1.建立表:Coursecreate table Course( ID int identity(1,1),--ID Student varchar(20) ,--学生 Sub varchar(2 ...
- Oracle 数据库表删除重复数据
删除重复数据并保留一条 方法一 1.建立临时表,记录重复的数据 create table 临时表 as select a.字段1,a.字段2,max(a.rowid) as dataid from 原 ...
- Android数据存储五种方式总结
本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用Cont ...
- oracle 批量删除表数据的4种方式
1.情景展示 情景一: 删除PRIMARY_INDEX_TEST表中,MINDEX_ID字段为空的数据 情景二: 删除VIRTUAL_CARD_TEST表中的脏数据 2.解决方案 情景一的解决方案 ...
- sql删除重复数据思路
总的思路就是先找出表中重复数据中的一条数据,插入临时表中,删除所有的重复数据,然后再将临时表中的数据插入表中.所以重点是如何找出重复数据中的一条数据,有三种情况 1.重复数据完全一样,使用distin ...
- 【转】SQL删除重复数据方法,留着备用
感谢孙潇楠前辈的总结,地址http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id name ...
- (转载)SQL删除重复数据方法
本文转载自http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id name ...
- SQL删除重复数据方法
例如: id name value 1 a pp 2 a ...
- 【转】SQL删除重复数据方法
例如: id name value 1 a pp 2 a ...
随机推荐
- 两个基于C++/Qt的开源WEB框架
1.tufao 项目地址: https://github.com/vinipsmaker/tufao 主页: http://vinipsmaker.github.io/tufao/ 介绍: Tufão ...
- LinkedList源代码深入剖析
第1部分 LinkedList介绍LinkedList简介 public class LinkedList<E> extends AbstractSequentialList<E&g ...
- RedMine项目管理系统安装问题(Linux版一键安装包)
安装环境 操作环境:VMware下安装的Parrot Security OS 系统 使用软件:bitnami-redmine---linux-x64-installer.run 问题描述: 安装步骤与 ...
- 关于hadoop的环境变量
export PATH export JAVA_HOME=/opt/jdk1.7 export PATH=$PATH:$JAVA_HOME/bin 为什么/etc/profile 添加了环境变量had ...
- Java面试题-并发框架
1. SynchronizedMap和ConcurrentHashMap有什么区别? 答:java5中新增了ConcurrentMap接口和它的一个实现类ConcurrentHashMap.Conc ...
- hdu4619Warm up 2
http://acm.hdu.edu.cn/showproblem.php?pid=4619 二分图匹配 最小点覆盖 = 最大匹配 #include <iostream> #includ ...
- NOI2013矩阵游戏
Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...
- 关闭 VS的实时调试器
可以这样关闭: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger HKEY_LOCAL_ ...
- 如何在一个frame中调用另一个frame中的javascript函数
1.htm <script language="javascript">function test(){alert("测试")}</scrip ...
- Spring Autowire自动装配介绍
在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象.但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的< ...