精确查找可以插入重复记录的表,解决记录重复的问题

曾经有个用户在恢复用友数据库时,还原到用友环境时,发现菜单重复,一个按钮变出好几个相同的按钮,就像孙悟空拔出毫毛变出好多个小孙悟空,一直在捉弄那个不会处理重复数据的抓耳挠腮的老妖精。本文介绍处理重复数据的处理方法。

  1. 找出可以插入重复数据的表

use [你要处理的数据库]

———————————————————————————–

select id,name from sysobjects where id in(

SELECT object_id FROM sys.indexes where object_id not in(

SELECT object_id FROM sys.indexes where is_unique=1 or is_primary_key=1 or is_unique_constraint=1)

) and xtype=’U’ order by name

———————————————————————————–

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\XG~%5GE85]D]_P5[0EKIIEW.png

再次过滤出哪些表存放有数据

———————————————————————————–

SELECT object_name (i.id) TableName,

rows as RowCnt

FROM sysindexes i

INNER JOIN sysObjects o

ON (o.id = i.id AND o.xType = ‘U’)

WHERE indid < 2 and RowCnt>0 and i.id in(

select id from sysobjects where id in(

SELECT object_id FROM sys.indexes where object_id not in(

SELECT object_id FROM sys.indexes where is_unique=1 or is_primary_key=1 or is_unique_constraint=1)

) and xtype=’U’

)

ORDER BY RowCnt desc

———————————————————————————–

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\GD5~)DLUKL3$I48T@RW07WA.png

  1. 处理重复数据的表,使相同记录只留一条

案例处理:重复数据处理测试.dbo.UA_Log_Ex 表有记录 520714条

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\X$BS7JR`~DZ67GP~HTE9$MG.png

去重查询方法:

USE [重复数据处理测试]

GO

———————————————————————————–

SELECT [cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

FROM 重复数据处理测试.dbo.UA_Log_Ex

group by

[cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

———————————————————————————–

把所有字段用group by 就能过滤出唯一的记录

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\V@0J{HISI$[MGM$){2HY6OV.png

看处理后,记录数量减半,数量为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

group by

[cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

———————————————————————————–

结果如下
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\2QNYNV]8}ZS8AZPDZ1()P}1.png

最后一步,把原表数据清空,把重复数据处理测试.dbo.TempTable表数据搬回来

delete FROM [重复数据处理测试].[dbo].[UA_Log_Ex] –删除原表数据

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\CJATBJY7]$Y)P7$(4C_RZ{P.png

把数据从重复数据处理测试.dbo.TempTable表数据搬回来

insert into [重复数据处理测试].[dbo].[UA_Log_Ex]

SELECT [cAcc_Id]

,[cSub_Id]

,[cUser_Id]

,[cAuth_Id]

,[cStation]

,[dInTime]

,[dOutTime]

,[iLogId]

,[iyear]

,[Success]

FROM [重复数据处理测试].[dbo].[TempTable]

C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\_M9%Q1TR3K_4MTO0%[MR2EN.png

查看结果:
C:\Users\qintl\AppData\Roaming\Tencent\Users\12869803\QQ\WinTemp\RichOle\O{DT85D42XVL_~RRBKART`G.png

到此就处理结束了

  1. 总结
  2. 过滤重复记录查询用 group by 所有字段
  3. 把过滤结果插入新临时表 into Temptable
  4. 清除原表数据 delete from table
  5. 把临时表数据搬回原始表,用 insert into 原表

达思覃廷良2019-05-06

已有 1 用户参与1
1 : 0
+1已打分
打赏 赞(3)
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏

已有 0 条评论