MSSQL如何在没有主键的表中删除重复数据
2014-06-28 09:33
274 查看
为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据:
为了验证表确实有重复数据,下面查询运用了一个group by 和having 子句只返回重复行,并对副本计数:
结果:
下面是运用窗口化删除重复行:
这种方法的关键是运用窗口化的,有row_number()函数和分区的over()子句。每个新分区会重新编号。设置over()子句为partition by每个要检查重复数据的列。在这种情况下每一列都会进行检查。
运行窗口化查询,首先显示方法如何应用于行号:
结果:
每一个重复行都有一个比1大的rn值,所以,删除副本是比较容易的:
结果:
执行完上面语句后,下面用一条select语句测试删除重复数据的结果:
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如何在没有主键的表中删除重复数据
- sqlserver中如何删除没有主键的重复数据。
- 删除没有主键的表中的重复数据
- 如何在MSSQL删除多条重复数据
- sqlserver中多行所有数据重复,无法更新或删除问题,通常是在没有主键的情况下的表
- 错误修正:多行所有数据重复,无法更新或删除问题,通常是在没有主键的情况下的表.
- 如何在MSSQL删除多条重复数据
- 在ORACLE中如何删除表中的重复数据
- 在ORACLE中如何删除表中的重复数据
- 如何从一个表中随机地取出20 条不重复的数据? 主键是Id
- Oracle中如何删除表中重复数据
- oracle中如何删除重复数据
- oracle中如何删除重复数据
- 如何在list中删除重复的数据单元
- 有多个字段组成的联合主键,如何判断数据是否重复?
- oracle中如何删除重复数据
- Oracle 中如何删除重复数据
- oracle中如何删除重复数据
- oracle中如何删除重复数据
- 在ORACLE中如何删除表中的重复数据的补充