SQL Server2008中删除重复记录的方法分享

韩颜诺镇

韩颜诺镇

2016-02-19 10:40

下面图老师小编要跟大家分享SQL Server2008中删除重复记录的方法分享,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!
现在让我们来看在SQL SERVER 2008中如何删除这些记录, 首先,可以模拟造一些简单重复记录:
代码如下:

Create Table dbo.Employee (
[Id] int Primary KEY ,
[Name] varchar(50),
[Age] int,
[Sex] bit default 1
)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(1,'James',25,default)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(2,'James',25,default)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(3,'James',25,default)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(4,'Lisa',24,0)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(5,'Lisa',24,0)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(6,'Lisa',24,0)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(7,'Mirsa',23,0)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(8,'Mirsa',23,0)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(9,'Mirsa',23,0)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(10,'John',26,default)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(11,'Abraham',28,default)
Insert Into Employee ([Id] , [Name] , [Age] , [Sex] ) Values(12,'Lincoln',30,default)

OK,首先我们使用最常见的方法:

Delete From Employee Where Name in (select NameFrom Employee Group By Name Having Count(Name)1);
接着使用RowNumber():

Delete T From( Select Row_Number() Over(Partition By [Name] Order By (SELECT 0)) As RowNumber,* From Employee) TWhere T.RowNumber 1;

还可以使用CTE (Common Table Expressions):

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)代码如下:

With Dups as
(
select ROW_NUMBER() Over(Partition by [Name] Order by (SELECT 0)) as rn
FROM Employee
)
Delete From Dups
Where rn1;

再加上RANK()的CTE:
代码如下:

WITH Dups As
(
Select [ID],[Name],[Age],[Sex]
, ROW_NUMBER() OVER(Partition By [Name] Order By (SELECT 0)) AS rn
,RANK() OVER(Partition By [Name] Order By (SELECT 0)) AS rnk
FROM Employee
)
DELETE FROM Dups
WHERE rnrnk;

下面是这四个T-SQL查询的执行计划:

ExecutionPlan1

你可以看到没有用CTE的方法开销最大, 主要是在Table Spool, 这里开销了44%, Table Spool 是一个物理运算符。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)Table Spool 运算符扫描输入,并将各行的一个副本放入隐藏的假脱机表中,此表存储在 tempdb 数据库中并且仅在查询的生存期内存在。如果重绕该运算符(例如通过 Nested Loops 运算符重绕),但不需要任何重新绑定,则将使用假脱机数据,而不用重新扫描输入。
注意上面的方法只是在重复记录比较少的情况下, 如果重复记录多. DELETE将会非常慢, 最好的方法是复制目标数据到另一个新表,删除原来的表,重命名新表为原来的表. 或用临时表, 这样还可以减少数据库事务日志. 看下面的T-SQL:
代码如下:

WITH Dups As
(
Select [ID],[Name],[Age],[Sex]
, ROW_NUMBER() OVER(Partition By [ID] Order By (SELECT 0)) AS rn
FROM Employee
)
Select [ID],[Name],[Age],[Sex]
INTO dbo.EmployeeDupsTmp
FROM Dups
WHERE rn=1
DROP TABLE dbo.Employee;
EXEC sp_rename 'dbo.EmployeeDupsTmp','Employee'

希望这篇POST对您开发有帮助.作者:Petter Liu

展开更多 50%)
分享

猜你喜欢

SQL Server2008中删除重复记录的方法分享

编程语言 网络编程
SQL Server2008中删除重复记录的方法分享

在SQL Server中快速删除重复记录

MySQL mysql数据库
在SQL Server中快速删除重复记录

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

有关重复记录的删除(SQL SERVER)

ASP
有关重复记录的删除(SQL SERVER)

在SQL中删除重复记录(多种方法)

SQLServer
在SQL中删除重复记录(多种方法)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

删除重复记录

编程语言 网络编程
删除重复记录

SQL语句去掉重复记录获取重复记录

编程语言 网络编程
SQL语句去掉重复记录获取重复记录

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

html标签之Object和EMBED标签详解

html标签之Object和EMBED标签详解

用U盘来扩展系统内存

用U盘来扩展系统内存
下拉加载更多内容 ↓