SQL Server去除冗余数据

问:请问专家有这么一个表,表T1有两个字段a,b,如下:

  a     b

  01  10

  01  10

  01  12

  02  20

  要求1.删除a、b完全相同的记录,即结果为

  a     b

  01  12

  02  20

  要求2.删除a、b完全相同的记录,但保留一条。即结果为

  a     b

  01  10

  01  12

  02  20

  答:要求1

 

create table tb(a varchar(10),b int)
insert into tb
select '01',10 union all
select '01',10 union all
select '01',12 union all
select '02',20


delete tb
from (select a,b from tb group by a,b having count(*)>1) as s
where tb.a=s.a and tb.b=s.b

select * from tb

drop table tb

  要求2:

 

create table tb(a varchar(10),b int)
insert into tb
select '01',10 union all
select '01',10 union all
select '01',12 union all
select '02',20

select distinct * into #temp from tb

delete from tb

insert into tb
select * from #temp

select * from tb

drop table tb,#temp

  点评:实际上,这是一个典型的删除数据库重复记录的例子,这个应用在我们日常的数据库管理和编程过程中经常被用到,是一个比较经典的案例,下面给出几个比较常见的SQL Server去除冗余数据的方法给各位做个参考,希望能够帮助各位处理类似的问题:

  开发人员的噩梦——删除重复记录

  想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确。解决该问题的办法就是将这些重复的记录删除,只保留其中的一条。

  在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录。因为这种方法需要对整个表进行遍历,所以对于表中的记录数不是很大的时候还是可行的,如果一张表的数据达到上百万条,用游标的方法来删除简直是个噩梦,因为它会执行相当长的一段时间。

  四板斧——轻松消除重复记录

  殊不知在SQL Server中有一种更为简单的方法,它不需要用游标,只要写一句简单插入语句就能实现删除重复记录的功能。为了能清楚地表述,我们首先假设存在一个产品信息表Products,其表结构如下:

CREATE TABLE Products (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)


  表中的数据如图1:


  图1中可以看出,产品Chang和Tofu的记录在产品信息表中存在重复。现在要删除这些重复的记录,只保留其中的一条。步骤如下:

  第一板斧——建立一张具有相同结构的临时表

CREATE TABLE Products_temp (
ProductID int,
ProductName nvarchar (40),
Unit char(2),
UnitPrice money
)


  第二板斧——为该表加上索引,并使其忽略重复的值

  方法是在企业管理器中找到上面建立的临时表Products _temp,单击鼠标右键,选择所有任务,选择管理索引,选择新建。如图2所示。

  按照图2中圈出来的地方设置索引选项。


  第三板斧——拷贝产品信息到临时表

insert into Products_temp Select * from Products


  此时SQL Server会返回如下提示:

  服务器: 消息 3604,级别 16,状态 1,行 1

  已忽略重复的键。

  它表明在产品信息临时表Products_temp中不会有重复的行出现。

  第四板斧——将新的数据导入原表

  将原产品信息表Products清空,并将临时表Products_temp中数据导入,最后删除临时表Products_temp。

delete Products
insert into Products select * from Products_temp
drop table Products_temp


  这样就完成了对表中重复记录的删除。无论表有多大,它的执行速度都是相当快的,而且因为几乎不用写语句,所以它也是很安全的。

  小提示:上述方法中删除重复记录取决于创建唯一索引时选择的字段,在实际的操作过程中读者务必首先确认创建的唯一索引字段是否正确,以免将有用的数据删除。

http://www.cppblog.com/stevennash/archive/2007/12/29/13264.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值