. . . . . . . . . . . . . . Blog Garden' C plus plus (My technology Impire!)

................................................................ It‘s a age of economic globalization and Infomation globalization........................................

SQL Server去除冗余数据

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

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

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

posted on 2006-10-03 18:51 Technical Consultant 阅读(1555) 评论(1)  编辑 收藏 引用 所属分类: Database

Feedback

# re: SQL Server去除冗余数据 2007-12-29 10:58 jsn

这个答案有问题的吧
如果表的记录很多 你这样不要写死的啊 ??  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


My Links

Blog Stats

常用链接

留言簿(3)

随笔分类(47)

随笔档案(45)

文章分类(87)

文章档案(87)

相册

C++

Database

Game Develope & Game Engine

Java

News

Web

最新随笔

搜索

最新评论

阅读排行榜

评论排行榜