为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据:

create database testdb

use testdb ;
go
create table DupsNoPK
(Col1 int Null,
Col2 char(5) Null
);
go insert DupsNoPK(Col1,Col2)
Values(1,'abc'),
(2,'abc'),
(2,'abc'),
(2,'abc'),
(7,'xyz'),
(7,'xyz');

为了验证表确实有重复数据,下面查询运用了一个group by 和having 子句只返回重复行,并对副本计数:

select Col1,Col2,Count(*) AS DupCount
from DupsNoPK
group by Col1,Col2
having count(*)>1;

结果:

下面是运用窗口化删除重复行:

这种方法的关键是运用窗口化的,有row_number()函数和分区的over()子句。每个新分区会重新编号。设置over()子句为partition by每个要检查重复数据的列。在这种情况下每一列都会进行检查。

运行窗口化查询,首先显示方法如何应用于行号:

select Col1,Col2, row_number()over(partition by Col1,Col2 order by Col1)as rn from DupsNoPK

结果:

每一个重复行都有一个比1大的rn值,所以,删除副本是比较容易的:

with DupsNumbered
as(
select Col1,Col2,
row_number()over(partition by Col1,Col2 order by Col1) as rn
from DupsNoPK
)
delete DupsNumbered where rn>1;

结果:

执行完上面语句后,下面用一条select语句测试删除重复数据的结果:

MSSQL如何在没有主键的表中删除重复数据的更多相关文章

  1. Oracle、SQLServer 删除表中的重复数据,只保留一条记录

    原文地址: https://blog.csdn.net/yangwenxue_admin/article/details/51742426 https://www.cnblogs.com/spring ...

  2. Oracle删除表中的重复数据

    Oracle数据库删除表中的重复数据,只保留其中的一条,以两个字段为例,提供两种方法 ①.直接delete重复的数据 delete from table_name t1 where (t1.col1, ...

  3. SQLServer 删除表中的重复数据

    create table Student(        ID varchar(10) not null,        Name varchar(10) not null, ); insert in ...

  4. Excel中如何在两个工作表中查找重复数据

    有时我们可能会在两种工作表中查找重复记录,当数据记录很多时,就必须通过简单的方法来实现.下面小编就与大家一起分享一下查看重复记录数据的方法,希望对大家有所帮助. 方法/步骤   为了讲解的需要,小编特 ...

  5. oracle学习----去除表中的重复数据

    重复的数据可能有这样两种情况,第一种:表中只有某些字段一样,第二种:两行记录完全一样.第一.对于部分字段重复数据的删除        先来谈谈如何查询重复的数据吧.        下面语句可以查询出那 ...

  6. 删除一个表中的重复数据同时保留第一次插入那一条以及sql优化

    业务:一个表中有很多数据(id为自增主键),在这些数据中有个别数据出现了重复的数据. 目标:需要把这些重复数据删除同时保留第一次插入的那一条数据,还要保持其它的数据不受影响. 解题过程: 第一步:查出 ...

  7. 从表中删除重复记录的sql

    --有一个表,假设是这样的 CREATE TABLE Test ( field1 ) primary key, field2 )); --假设field1上有索引. 要删除表中所有field1重复的记 ...

  8. C# DataAdapter.Update() 无法更新数据表中删除的数据行

    用DataAdapter.Update() 方法更新删除了部分DataRow 的 DataTable .但是数据库中的数据没有随着更新而变化. 原因:DataTable 删除 DataRow 时,使用 ...

  9. SQL Server从读写频繁的大表中删除大批量数据

    如果我们直接用delete from语句来删除读写频繁的大表中的数据,很有可能会因为where的条件是全表扫描从而导致整个表被锁住了.如果该表是读写频繁的生产库那简直就是一场灾难,所有的线上读写请求都 ...

随机推荐

  1. WCF初探-25:WCF中使用XmlSerializer类

    前言 在上一篇WCF序列化和反序列化中,文章介绍了WCF序列化和反序列化的机制,虽然WCF针对序列化提供了默认的DataContractSerializer序列化引擎,但是WCF还支持其他的序列化引擎 ...

  2. office2010密钥

    J33GT-XVVYK-VHBBC-VY7FB-MTQ4CGRPWH-7CDHQ-K3G3C-JH2KX-C88H86CCCX-Y93YP-3WQGT-YCKFW-QTTT76QFDX-PYH2G-P ...

  3. java动手动脑和课后实验型问题

    1.以下代码的输出结果是什么?为什么会有这个结果? int[] a = { 5, 7, 20 }; System.out.println("a数组中的元素:"); // 循环输出a ...

  4. linux下关于Apache设置二级域名绑定二级目录的方法

    背景:对于一些论坛网站,某些目录需要制定二级域名去访问,这时候就要在apache中用二级域名绑定二级目录. 方法: 1.首先你要找到apache安装路径,在apahce安装路径下的conf文件夹中找到 ...

  5. 关于sysprocesses表各字段的作用

    sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息.这些进程可以是客户端进程或系统进程.sysprocesses 只存储在 master 数据库 ...

  6. python网络编程【二】(使用TCP)

    1.建立socket 对于一个客户端程序来说,建立一个socket需要两个步骤.首先,您需要建立一个实际的socket对象.其次,您需要把它连接到远程服务器上. 在建立socket对象的时候,您需要告 ...

  7. HDU 1222

    题意: 一头狼和一头兔子在一座山中,给你一个数n表示洞的个数,编号从0~n-1.兔子可以随意躲在其中一个洞中,狼每次都从编号为0的洞出发,接下来走到第m个洞中,问兔子能不能活下来,即不被狼吃掉.例如: ...

  8. EasyUI之加载js文件顺序

    在使用EasyUI时,需要引用EasyUI框架的js文件,要注意加载的顺序,jquery.min.js一定要第一个被加载.

  9. SQL Server中查询某个数据库中表的个数

    --SQL Server中 数表: SELECT * FROM SYSOBJECTS WHERE xtype = 'U'; SELECT COUNT(*) FROM SYSOBJECTS WHERE ...

  10. ldap + kerberos 整合

    第一部分:ldap1. 安装ldap yum install -y openldap openldap-clients openldap-servers openldap-devel 2. 配置lda ...