手机
当前位置:查字典教程网 >编程开发 >mssql数据库 >SQL Server2008中删除重复记录的方法分享
SQL Server2008中删除重复记录的方法分享
摘要:现在让我们来看在SQLSERVER2008中如何删除这些记录,首先,可以模拟造一些简单重复记录:复制代码代码如下:CreateTabledb...

现在让我们来看在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):

复制代码 代码如下:

With Dups as

(

select ROW_NUMBER() Over(Partition by [Name] Order by (SELECT 0)) as rn

FROM Employee

)

Delete From Dups

Where rn>1;

再加上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 rn<>rnk;

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

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

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

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

【SQL Server2008中删除重复记录的方法分享】相关文章:

SQLServer 2005 控制用户权限访问表图文教程

SQLServer2005重建索引前后对比分析

使用 SQL Server 添加删除修改查询储存过程

SQL Server 2005 中使用 Try Catch 处理异常

SQL Server 2005 返回修改后的数据

SQL Server 2005 定时执行SQL语句的方法

SQL Server 2005中的外联结用法

在SQL Server中将数据导出为XML和Json的方法

在SQLServer 2005中编写存储过程

SQL Server 中 RAISERROR 的用法详细介绍

精品推荐
分类导航