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 ...
随机推荐
- Android:控件Spinner实现下拉列表
在Web开发中,HTML提供了下拉列表的实现,就是使用<select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>表示即可.这是在Web开发中一个必不可少的交 ...
- Silverlight之OOB模式下的一些事
本文简介: 1.为什么要使用OOB?使用OOB的作用? 2.如何实现OOB模式 3.对OOB进行一些设置: 4.检测OOB的安装状态: 5.更新应用程序: 6.WebBrowser控件: 7.桌面通知 ...
- SGU 101
SGU 101,郁闷,想出来算法,但是不知道是哪个地方的问题,wa在第四个test上. #include <iostream> #include <vector> #inclu ...
- ScrollView can host only one direct child 解决
主要是ScrollView内部只能有一个子元素,即不能并列两个子元素,所以需要把所有的子元素放到一个LinearLayout内部或RelativeLayout等其他布局方式让后再在这个layout外部 ...
- Android 应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
- win8 hyper-v 禁用不必卸载虚拟机
转载:http://tylzwp.blogbus.com/logs/232938121.html 禁用hyperv的目的是使用之前在用的VMware的虚拟机,不必重新处理一遍. 具体操作: 1确报之前 ...
- Source Insight 安装使用
习惯了在source insight下编辑阅读源码,在linux下用vi总是用不好 ,还是在Ubuntu上用回熟悉的source insight. 在Ubuntu中,安装Windows程序用wine, ...
- 类似百度文库pdf2swf+flexpaper解决pdf在线阅读的效果
1:工具准备swftools.exe 下载http://www.swftools.org/download.html 安装至D盘SWFTools提供了一系列将各种文件转成swf的工具:font2swf ...
- 简单的ftpserver设置
一.安装: yum install vsftpd* 二. 修改配置文档如下: vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO chroot_list_en ...
- 音频(3)Android TTS技术支持朗读英文
Android对TTS技术的支持 Android 1.6开始支持TTS(Text To Speech)技术,通过该技术可以将文本转换成语音.目前2015-09-06只支持朗读英文. TTS技术的核心是 ...