问题:一个表有自增的ID列,表中有一些记录内容重复,也就是说这些记录除了ID不同之外,其他的信息都相同。需要把重复的记录保留一条,剩下的删除。

这种需求一般开发人员都会,我这里写出两个版本。

版本一:由于记录有自增列,所以自增列可以做为记录的唯一标识,由此可见,重复的记录的自增ID是一个递增关系,这里我们可以只保留ID最小的那条记录,其它的全部删除。利用一个嵌套语句就非常容易写出下面的SQL。其中的sname,saddress是记录除了ID外的所有列。

DELETE  FROM a
WHERE   id NOT IN ( SELECT  MIN(id)
                    FROM    a
                    GROUP BY sname,
                            saddress )

版本二:充分利用SQL05的几个比较实用的特性。这里先简单说说要用到的几个特性。详细用法可到网上搜索下。

1:ROW_NUMBER,它的作用就是用来生成行号,默认是从1开始。

2:公用表表达式(CTE),我这里并不会利用它的递归,而是用它来简化嵌套查询及对表自身引用功能。CTE的语法如下:

[ WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
        expression_name [ ( column_name [ ,n ] ) ]
    AS
        ( CTE_query_definition )

说明:1>CTE在某种程序上相当表变量或者临时表的功能。但比起表变量来说它最大的优势是对自身的引用,CTE语句后面紧跟的select ,update,delete等,操作的结果都会直接反应的实际物理表中。相比临时表,最大优势无非是性能,临时表实际是一张物理存在的表,在对它进行操作时,会产生额外的IO开销以及管理上的开销。

2>CTE语法后面需要直接跟上使用CTE的相关语句select ,update,delete等,否则CTE会失效,下面的语句是错误的:

代码

WITH   b AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY sname, saddress ORDER BY sname, saddress ) AS rn,
                        *
               FROM     a
             )
    DELETE  FROM b
    WHERE   rn > 1
 SELECT * from a
 SELECT * FROM b WHERE rn>1

3:PARTITION BY,分区函数。和聚合函数不同的地方在于它能返回一个分组中的多条记录,聚合函数一般只有一条反映统计值的记录,partition  by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组 。

经过上面的三个关键字的介绍后,下面给出三者相结合后的结果。

代码

WITH   b AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY sname, saddress ORDER BY sname, saddress ) AS rn,
                        *
               FROM     a
             )
    DELETE  FROM b
    WHERE   rn > 1

版本一和版本二比较:
 
         1:版本二更加容易阅读。

2:版本二性能较版本一强。我们可以通过以以信息来看。可以看到版本一会发生两次表扫描。

代码

Table 'a'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 1, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(0 row(s) affected)
Table 'a'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(0 row(s) affected)

转载于:https://www.cnblogs.com/ASPNET2008/archive/2009/12/08/1619638.html

利用SQL05特性删除表中重复数据相关推荐

  1. 利用SQL Server 2005特性删除表中重复数据

    http://www.cnblogs.com/haosola/archive/2010/02/04/1663150.html 转载于:https://www.cnblogs.com/modernsky ...

  2. 查询和删除表中重复数据sql语句

    查询和删除表中重复数据sql语句 (一) 1.查询表中重复数据.select * from people where peopleId in (select   peopleId  from   pe ...

  3. MySql删除表中重复数据

    有一表中存在大量重复数据 在此记录下我删除表内重复数据的方法 -- 新增测试表 create table basic_farmer ( id INT(11), user_name VARCHAR(25 ...

  4. sql server如何删除表中重复数据

    当我们需要删除表中重复的数据的时候,该如何操作呢? 具体操作分为四个步骤: 1.将查询到的无重复数据存入临时表中 2.删除原表的内容 3.将临时表插入到原表中 4.删除临时表 理解起来是比较简单的,这 ...

  5. SQL Server数据库表的基本操作(批量插入、删除、查询数据,删除表中重复数据方法)

    实验名称:数据库表的基本操作与表内数据操作 实验目的: 掌握数据库表创建方法(交互式.T-SQL法) 掌握修改数据库表结构的方法 掌握删除数据库表的方法 掌握交互式EXCEL文件录入数据至数据库表的方 ...

  6. mysql 删除表中重复数据并保留一条

    最近有个需求,给角色添加菜单权限,这是一个role_menu 表.里面存放的是角色id和菜单id,是批量给一种类型角色添加,但有可能角色人为添加过,因为数据量还是比较大的,如果先查询这个有没有添加过再 ...

  7. mysql中怎么删除表中的一列数据_mysql如何删除表中一行数据?

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

  8. php删除表中一行数据,mysql如何删除表中一行数据?

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

  9. mysql数据库中怎么删除一行_数据库教程_mysql如何删除表中一行数据?- 中国it教程网...

    mysql中使用DELETE语句删除表中一行数据,语句为"DELETE FROM 表名称 WHERE 列名称 = 值".删除所有行的语句为"DELETE FROM tab ...

最新文章

  1. Django xadmin 后台自定义action 动作
  2. mysql 并发避免锁表_MYSQL锁表的用法,防止并发情况下的重复数据
  3. c语言case后加3 5,10.程序流程控制:switch-case
  4. Python小知识 | 这些技能你不会?(三)
  5. Mahout系列之----共轭梯度预处理
  6. 来和 webpack 谈场恋爱吧!这课程好甜!
  7. spring 使用其他类protected方法_Java操作bean、属性、方法的使用工具类
  8. C语言之利用,函数的命名及变量的作用域实现两个数之间的交换。
  9. SMTP协议初探(二)----linux下c编程实现发邮件
  10. android (java) 网络发送get/post请求参数设置
  11. 输入法候选词排列的两种新方式
  12. 随机梯度下降法(SGD)
  13. 我的世界怎么在服务器中显示键位,我的世界基础键位操作介绍 | 我的世界 | MC世界侠...
  14. 第2章 系统配置及驱动配置
  15. 质谱的工作原理及发展史
  16. SAI2和PS如何查看当前鼠标位置内容的图层
  17. linux临时目录不可查询,用find、rm命令清理Linux临时文件夹及检查Linux临时文件夹何时已满...
  18. C# Word 悬挂缩进 首行缩进 的设置
  19. mysql cmd insecure_看各路神仙如何大战MySQL insecure warning报警有感
  20. Navicat 的使用

热门文章

  1. [Bugku CTF——Pwn] pwn1
  2. [Jarvis OJ - PWN]——[XMAN]level2
  3. 关于优酷开放SDK之onPrepareListener
  4. 上海出租车价格计算方法
  5. workman 使用心得
  6. 一个页面是否应该全部组件化
  7. jzoj_3385_黑魔法师之门
  8. 用keras作CNN卷积网络书本分类(书本、非书本)
  9. NioEventLoopGroup的构造函数
  10. mybatis的配置文件中selectKey标签问题