zjcxc(邹建) 如果暂时不考虑被用过的情况,该如何做?
请问J老师是哪位?

解决方案 »

  1.   

    --笨人只有笨方法
    --抛块砖试试,希望能引来美玉
    --速度很慢,别在使用中的服务器测试--建表
    create table a(
    a int
    )
    go
    create table b(
    b int
    )
    go--放结果
    create table c(
    ida varchar(100),
    idb varchar(100)
    )
    go--说明:本来想用很多数据的,测试证明,实在太慢,删除了
    /*
    insert a
    select top 100 a+b+c+d+e+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b,(
    select 0 as c union all select 100 union all select 200
    union all select 300 union all select 400 union all select 500
    union all select 600 union all select 700 union all select 800
    union all select 900
    ) as c,(
    select 0 as d union all select 1000 union all select 2000
    union all select 3000 union all select 4000 union all select 5000
    union all select 6000 union all select 7000 union all select 8000
    union all select 9000
    ) as d,(
    select 0 as e union all select 10000 union all select 20000
    union all select 30000 union all select 40000 union all select 50000
    union all select 60000 union all select 70000 union all select 80000
    union all select 90000
    ) as e
    order by newid()goinsert b
    select top 100 a+b+c+d+e+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b,(
    select 0 as c union all select 100 union all select 200
    union all select 300 union all select 400 union all select 500
    union all select 600 union all select 700 union all select 800
    union all select 900
    ) as c,(
    select 0 as d union all select 1000 union all select 2000
    union all select 3000 union all select 4000 union all select 5000
    union all select 6000 union all select 7000 union all select 8000
    union all select 9000
    ) as d,(
    select 0 as e union all select 10000 union all select 20000
    union all select 30000 union all select 40000 union all select 50000
    union all select 60000 union all select 70000 union all select 80000
    union all select 90000
    ) as e
    order by newid()go
    */
      

  2.   

    --现在使用25X25 1-100可能重复的数据测试,耗时14分钟,找到15对数据
    insert a
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert a
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert a
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert a
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert a
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert b
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert b
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert b
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert b
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()goinsert b
    select top 5 a+b+1
    from (
    select 0 as a union all select 1 union all select 2
    union all select 3 union all select 4 union all select 5
    union all select 6 union all select 7 union all select 8
    union all select 9
    ) as a,(
    select 0 as b union all select 10 union all select 20
    union all select 30 union all select 40 union all select 50
    union all select 60 union all select 70 union all select 80
    union all select 90
    ) as b
    order by newid()go
      

  3.   

    --连续回复不能超过三次,只好动用马甲了--建立一个辅助函数
    create function GetSql(@num int,@FName varchar(30),@TName varchar(30))
    returns varchar(2000)
    as
    begin
    declare @r varchar(2000)
    set @r=''
    if @num <=0 return @r
    declare @a varchar(400)
    set @a='a1.'+@FName
    declare @id varchar(1000)
    set @id='cast(a1.id as varchar(10))'
    declare @from varchar(400)
    set @from=@TName+' a1'
    declare @where varchar(1000)
    set @where='a1.checked=0'
    declare @i int
    set @i =2
    while @i<=@num
            begin
    set @a=@a+'+a'+cast(@i as varchar(10))+'.'+@FName
    set @id=@id+'+'',''+cast(a'+cast(@i as varchar(10))+'.id as varchar(10))'
    set @from=@from+','+@TName+' a'+cast(@i as varchar(10))
    set @where=@where+' and a'+cast(@i as varchar(10))+'.checked=0 and a'+cast(@i-1 as varchar(10))+'.id<a'+cast(@i as varchar(10))+'.id'
    set @i=@i+1
            end
    set @r='select '+@FName+'='+@a+',id='+@id+' from '+@from+' where '+@where
    return @r
    endgo
    --一下是检查代码
    select IDENTITY(int,1,1) as id,0 as checked,* into #a from a
    select IDENTITY(int,1,1) as id,0 as checked,* into #b from b
    declare @i int
    set @i =1
    declare @j int
    set @j =1
    declare @k intdeclare @sql varchar(2000)
    declare @a int
    declare @b int
    declare @Ida varchar(100)
    declare @Idb varchar(100)BeginOf:
    set @i =1
    set @j =1
    set @sql=''
    set @a=null
    set @b=null
    set @ida=null
    set @idb=nullwhile @i<10
    begin
    set @sql=dbo.GetSql(@i,'a','#a')
    set @sql='declare curA INSENSITIVE CURSOR for '+@sql +' order by a1.id for READ ONLY '
    exec (@sql)
            open curA
    FETCH NEXT FROM curA
    INTO @a,@ida
    WHILE @@FETCH_STATUS = 0
    begin
    set @j=1
    while @j<10
    begin
    set @sql=dbo.GetSql(@j,'b','#b')
    set @sql='declare curB INSENSITIVE CURSOR for '+@sql +' order by a1.id for READ ONLY '
    exec (@sql)
             open curB
    FETCH NEXT FROM curB
    INTO @b,@idb
    WHILE @@FETCH_STATUS = 0
    begin
    if @a=@b     --呵呵,好不容易找到一个
    begin
    exec('update #a set Checked=1 where id in ('+@ida+')')
    exec('update #b set Checked=1 where id in ('+@idb+')')
    insert c values(@ida,@idb)
    CLOSE curA
    DEALLOCATE curA
    CLOSE curB
    DEALLOCATE curB
    goto BeginOf
    end
    FETCH NEXT FROM curB
    INTO @b,@idb
    end
    set @j=@j+1
    CLOSE curB
    DEALLOCATE curB
    end
    FETCH NEXT FROM curA
    INTO @a,@ida
    end
    set @i=@i+1
    CLOSE curA
    DEALLOCATE curA
    end
    select sum(a) as suma from #a where checked=1
    select sum(b) as sumb from #b where checked=1select * from #b where checked=0
    select * from #a where checked=0select * from c结果:suma        
    ----------- 
    1094(所影响的行数为 1 行)sumb        
    ----------- 
    1094(所影响的行数为 1 行)
    id          checked     b           
    ----------- ----------- ----------- 
    6           0           93
    20          0           65(所影响的行数为 2 行)id          checked     a           
    ----------- ----------- ----------- 
    5           0           76
    7           0           36
    8           0           3
    20          0           87(所影响的行数为 4 行)
    ida                                                                                                  idb                                                                                                  
    ---------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------- 
    11                                                                                                   7,22
    12                                                                                                   9,11
    14                                                                                                   23,24
    15                                                                                                   10,17,25
    18                                                                                                   4,21
    21                                                                                                   14
    3                                                                                                    1
    4                                                                                                    18
    6                                                                                                    3
    9                                                                                                    8,13
    10,23                                                                                                19
    16,19                                                                                                5
    17,22                                                                                                12
    24,25                                                                                                2,15
    1,2,13                                                                                               16(所影响的行数为 15 行)
    --删除临时表
    drop table #a
    drop table #b--删除测试环境
    drop function GetSql
    drop table a
    drop table b
    drop table c