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

 --方法一,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删除重复数据的五种方式的更多相关文章

  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. dynamic_cast 用法

    dynamic_cast < type-id > ( expression ) 该运算符把expression转换成type-id类型的对象.Type-id必须是类的指针.类的引用或者vo ...

  2. size_t和ssize_t

    Ssize_t 与size_t 跟踪linux源码得到以下宏: #ifndef _SIZE_T #define _SIZE_T typedef __kernel_size_t         size ...

  3. Complete The Pattern #6 - Odd Ladder

    Complete The Pattern #6 - Odd Ladder Task: You have to write a function pattern which creates the fo ...

  4. linux shell 常用基本语法

    转自网络,真正来源不详.... 一. Linux基本命令 1.1.  cp命令 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,功能十分强大. 语法: cp [选项] 源文件或目录 目标文件或 ...

  5. 数据结构———KMP

    今天照着课本敲了一下KMP.. 以OJ上的一个题为例敲了一下.. 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem& ...

  6. Flash挡住DIV的解决方法

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...

  7. APIO2010特别行动队(单调队列、斜率优化)

    其实这题一看知道应该是DP,再一看数据范围肯定就是单调队列了. 不过我还不太懂神马单调队列.斜率优化…… 附上天牛的题解:http://www.cnblogs.com/neverforget/arch ...

  8. [swustoj 1091] 土豪我们做朋友吧

    土豪我们做朋友吧(1091) 问题描述: 人都有缺钱的时候,缺钱的时候要是有个朋友肯帮助你,那将是一件非常幸福的事情.有N个人(编号为1到N),一开始他们互相都不认识,后来发生了M件事情,事情分为2个 ...

  9. tar 命令打包,除了某个目录剩下的都打包

    tar czvf beifen.tar.gz  ./webdata  --exclude webdata/uploadfiles

  10. 中国Azure媒体服务RESTAPI的Endpoint

    Amber Zhao  Thu, Feb 26 2015 4:09 AM 由于海外Azure和中国Azure有不同的domain,很多用户在使用媒体服务RESTAPI时,需要指定中国Azure媒体服务 ...