• 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
  • 相关阅读:
    Linux命令:mapfile
    Linux命令:logout
    行式数据库和列式数据库的浅析
    hadoop常见错误集锦
    hadoop环境搭建遇到问题集锦
    杀毒的一点学习
    powerdesigner的学习
    突然的想法
    shell脚本入门教程(转)
    java classpath深入详解(转)
  • 原文地址:https://www.cnblogs.com/fabao/p/13952899.html
Copyright © 2020-2023  润新知