SQL------去重方案

以下方案暂定,后面会试一下效果。

主要的思路是分段去重,因为直接一个语句去重太慢了。

脚本试着分段数量合理了以后,就做成程序,程序多开来处理不同的分段。

--首先按照【txt】字段建立索引
--然后下面的脚本会按照这个索引排序,分段,生成【对每个分段查询重复id】的sql语句。
--再下一步,想在程序内用dataAdapter进行删除,因为比用delete语句快一些。
--写程序前先用这个脚本试试,看看分段数量多少合适。

--总行数--大体
declare @rowCount int = (
    select max(ROW_NUMBER) from 
    (
        select 
            ROW_NUMBER() OVER(order by txt) as ROW_NUMBER
        from ZZ1
    ) t
)

--每个分段的行数
declare @FenDuanCount int = 1000

--最大的左右界限
declare @maxRightIdx int = @rowCount /@FenDuanCount +1
declare @maxLeftIdx int = @rowCount /@FenDuanCount 

--左右界限表
if object_id('tempdb..#tIdx') is not null drop table #tIdx
select 
    @maxLeftIdx as LeftIdx
    ,@maxRightIdx as RightIdx
into #tIdx

--求出每个左右界限
declare @curLeftIdx int = @maxLeftIdx -1
while(@curLeftIdx >=0)
begin
    insert into #tIdx (LeftIdx,RightIdx) values (@curLeftIdx,@curLeftIdx+1)
    set @curLeftIdx = @curLeftIdx - 1
end

--生成语句若干--用于查询重复的id
select 
'  
if object_id(''tempdb..#tFenDuan'') is not null drop table #tFenDuan
--分段数据
select 
    *
into #tFenDuan
from 
(
    select 
        ROW_NUMBER() OVER(order by txt) as ROW_NUMBER
        ,ID
        ,txt
    from ZZ1
) t
where ROW_NUMBER between '+Convert(varchar(100),LeftIdx*@FenDuanCount)+' and '+ convert(varchar(100),RightIdx*@FenDuanCount) +
'
--重复的数据
select * 
FROM #tFenDuan t 
WHERE t.ROW_NUMBER > (
    SELECT MIN(n.ROW_NUMBER) 
    FROM #tFenDuan n 
    WHERE t.txt = n.txt)
'
from #tIdx

 

posted @ 2020-11-10 11:26  法宝  阅读(159)  评论(0编辑  收藏  举报