曾经有个达思sql数据库修复软件的用户在恢复用友数据库时,还原到用友环境时,发现菜单重复,一个按钮变出好几个相同的按钮,就像孙悟空拔出毫毛变出好多个小孙悟空,一直在捉弄那个不会处理重复数据的抓耳挠腮的老妖精。本文介绍处理重复数据的处理方法。
一、找出可以插入重复数据的表
use[你要处理的数据库]
-----------------------------------------------------------------------------------
selectid,namefromsysobjectswhereidin(
SELECTobject_idFROMsys.indexeswhereobject_idnotin(
SELECTobject_idFROMsys.indexeswhereis_unique=1oris_primary_key=1oris_unique_constraint=1)
)andxtype='U'orderbyname
-----------------------------------------------------------------------------------
再次过滤出哪些表存放有数据
-----------------------------------------------------------------------------------
SELECTobject_name(i.id)TableName,
rowsasRowCnt
FROMsysindexesi
INNERJOINsysObjectso
ON(o.id=i.idANDo.xType='U')
WHEREindid<2andRowCnt>0andi.idin(
selectidfromsysobjectswhereidin(
SELECTobject_idFROMsys.indexeswhereobject_idnotin(
SELECTobject_idFROMsys.indexeswhereis_unique=1oris_primary_key=1oris_unique_constraint=1)
)andxtype='U'
)
ORDERBYRowCntdesc
-----------------------------------------------------------------------------------
二、处理重复数据的表,使相同记录只留一条
案例处理:重复数据处理测试.dbo.UA_Log_Ex表有记录 520714条
去重查询方法:
USE[重复数据处理测试]
GO
-----------------------------------------------------------------------------------
SELECT[cAcc_Id]
,[cSub_Id]
,[cUser_Id]
,[cAuth_Id]
,[cStation]
,[dInTime]
,[dOutTime]
,[iLogId]
,[iyear]
,[Success]
FROM重复数据处理测试.dbo.UA_Log_Ex
groupby
[cAcc_Id]
,[cSub_Id]
,[cUser_Id]
,[cAuth_Id]
,[cStation]
,[dInTime]
,[dOutTime]
,[iLogId]
,[iyear]
,[Success]
-----------------------------------------------------------------------------------
把所有字段用groupby就能过滤出唯一的记录
看处理后,记录数量减半,数量为260357条
把过滤后的记录插入一张临时表重复数据处理测试.dbo.TempTable,这个表会自动生成
USE[重复数据处理测试]
GO
-----------------------------------------------------------------------------------
SELECT[cAcc_Id]
,[cSub_Id]
,[cUser_Id]
,[cAuth_Id]
,[cStation]
,[dInTime]
,[dOutTime]
,[iLogId]
,[iyear]
,[Success]
into 重复数据处理测试.dbo.TempTable
FROM重复数据处理测试.dbo.UA_Log_Ex
groupby
[cAcc_Id]
,[cSub_Id]
,[cUser_Id]
,[cAuth_Id]
,[cStation]
,[dInTime]
,[dOutTime]
,[iLogId]
,[iyear]
,[Success]
-----------------------------------------------------------------------------------
结果如下
最后一步,把原表数据清空,把重复数据处理测试.dbo.TempTable表数据搬回来
deleteFROM[重复数据处理测试].[dbo].[UA_Log_Ex] --删除原表数据
把数据从重复数据处理测试.dbo.TempTable表数据搬回来
insertinto[重复数据处理测试].[dbo].[UA_Log_Ex]
SELECT[cAcc_Id]
,[cSub_Id]
,[cUser_Id]
,[cAuth_Id]
,[cStation]
,[dInTime]
,[dOutTime]
,[iLogId]
,[iyear]
,[Success]
FROM[重复数据处理测试].[dbo].[TempTable]
查看结果:
到此就处理结束了
三、总结
1、 过滤重复记录查询用 group by 所有字段
2、 把过滤结果插入新临时表 into Temptable
3、 清除原表数据 delete from table
4、 把临时表数据搬回原始表,用 insert into 原表
技术交流:QQ55356052遇到问题,请拨打达思数据恢复中心电话:400-700-0017