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

简介: 原文:MSSQL如何在没有主键的表中删除重复数据为了对重复数据进行实验,下面建一个设计不太好(没有主键)表并插入了一些重复数据: create database testdb use testdb ; go create table DupsNoPK (Col1 int Null...
原文: 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语句测试删除重复数据的结果:

目录
相关文章
|
5月前
|
关系型数据库 索引
DB2查询主键、索引、表约束
DB2查询主键、索引、表约束
324 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL删除外键、增加外键及删除主键、增加主键
MySQL删除外键、增加外键及删除主键、增加主键
25 0
|
7月前
|
存储 关系型数据库 MySQL
mysql添加或删除表以及给数据表添加或删除列
mysql添加或删除表以及给数据表添加或删除列
85 1
|
8月前
|
Oracle 关系型数据库 MySQL
数据库——查询某个字段在哪些表中
数据库——查询某个字段在哪些表中
|
10月前
|
关系型数据库 MySQL
|
SQL 关系型数据库 MySQL
mysql ,如何将B表的字段f 作为A表的主键s的外键?
假设您已经有两个表A和B,且它们都已经有字段,其中A表的主键为s,B表中的字段为f。要将B表的字段f作为A表的主键s的外键,可以使用以下的 SQL 语句来实现:
|
关系型数据库 MySQL
mysql删除重复数据只保留一条(没有主键)
mysql删除重复数据只保留一条(没有主键)
768 0
|
SQL 关系型数据库 MySQL
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
1173 0
MYSQL 查找单个字段或者多个字段重复数据,清除重复数据
|
关系型数据库 MySQL
mysql用一个表中的字段批量更新另一个表中的字段
mysql用一个表中的字段批量更新另一个表中的字段
597 0

热门文章

最新文章