MSSQL如何在没有主键的表中删除重复数据

原文:MSSQL如何在没有主键的表中删除重复数据

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

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语句测试删除重复数据的结果:

时间: 2024-10-01 16:07:04

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

删除没有主键的表中的重复记录

删除没有主键的表中的重复记录 create procedure delrepeat as begin SELECT distinct *  INTO testTemp FROM test delete from test insert into test SELECT *  FROM testTemp drop table testTemp end distinct:用于查询中去除重复项 begin~end范围语句表示存储过程中作为整体执行的语句块 oracle数据库教程 delete from

MSSql简单查询出数据表中所有重复数据的方法_MsSql

本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法.分享给大家供大家参考,具体如下: 这里直接给出下面的例子: SELECT * FROM SYS_LogContent slc WHERE slc.LogInfo_ID IN ( SELECT slc2.LogInfo_ID FROM SYS_LogContent slc2 GROUP BY slc2.LogInfo_ID HAVING COUNT(*)>1 ) 简单说明: 关键代码在于上面的括号中.要想查询出所有重复的数据,可以按照某

MSSql简单查询出数据表中所有重复数据的方法

本文实例讲述了MSSql简单查询出数据表中所有重复数据的方法.分享给大家供大家参考,具体如下: 这里直接给出下面的例子: SELECT * FROM SYS_LogContent slc WHERE slc.LogInfo_ID IN ( SELECT slc2.LogInfo_ID FROM SYS_LogContent slc2 GROUP BY slc2.LogInfo_ID HAVING COUNT(*)>1 ) 简单说明: 关键代码在于上面的括号中.要想查询出所有重复的数据,可以按照某

怎样删除表中的重复数据,谢谢大家

问题描述 怎样删除表中的重复数据,谢谢大家 表内容如下: id fwbm kjbh sfxm dj yl ....................... 52578 d01142 d011422015928 001 .400 0 54.70 54.70 0 0 2015-09-28 00:00:00.000 NULL 52579 d01142 d011422015928 040 2.990 2 5.98 5.98 0 0 2015-09-28 00:00:00.000 NULL 52580 d0

如何去除数据表中的重复数据

通常情况下,一个我们在做一个产品的时候,一开始可能由于设计考虑不周或者程序写的不够严谨,某个字段上的值产生重复了,但是又必须去掉,这个时候就稍微麻烦了一点,直接加一个UNIQUE KEY肯定是不行了,因为会报错. 现在,我们来采用一种变通的办法,不过可能会丢失一些数据 :) 在这里,我们设定一个表,其结构如下: mysql> desc `user`;+-------+------------------+------+-----+---------+----------------+| Fiel

Excel怎么在两个工作表中查找重复数据

  2.现在我们的实例是从Sheet3工作表找出己经在Sheet4工作表中姓名相同的记录.因为我们现在在Sheet3工作表对应列中输入以下"=if(B2=" 如下图红框所示. 3.现在我们在excel中直接切换到Sheet4工作表中,然后如下图所示框选姓名区域,并按回车键. 4.现在再回到sheet3工作表后,补全公式"=if(B2=Sheet4!B2:B24,"是","否")"如下图所示. 5.然后将光标移动到单元格右下角,

一种简单的表中删除重复行的方法

先创建一个与原表一样的表,然后在表上创建 ignore_dup_key 索引,如下:CREATE UNIQUE INDEX removedupsON #table_copy (name)WITH IGNORE_DUP_KEY然后在导入原表数据,简单吧

Oracle 查询与删除表中的重复记录sql语句

方法:  代码如下 复制代码 group by  XX having count(*)>1,rowid,distinct,temporary table,procedure 下面语句可以查询出那些数据是重复的:  代码如下 复制代码 select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1 将上面的>号改为=号就可以查询出没有重复的数据了. 想要删除这些重复的数据,可以使用下面语句进行删除  代码如下 复制代

oracle-表A以某几个主键参照表B,A.日期 比B.日期最大值大,没有的情况下比最小值小

问题描述 表A以某几个主键参照表B,A.日期 比B.日期最大值大,没有的情况下比最小值小 表A以某几个主键参照表B,A.日期 比B.日期最大值大,没有的情况下比最小值小 解决方案 不太理解没有什么的情况下? 表A以某几个主键参照表B,A.日期 比B.日期最大值大 这个用子查询 select * from a where a.日期 > (select max(日期) from b) 解决方案二: 子查询 select * from a where a.日期 > (select max(日期) f