本帖最后由 as198645 于 2013-08-23 11:12:06 编辑

解决方案 »

  1.   

    应该是<=5吧?update tb set a2=a3
    where a1<=5
      

  2.   

    create table #tb(a1 int,a2 int,a3 int)
    insert into #tb
    select 1,null,11
    union all select 2,null,10
    union all select 3,null,9
    union all select 4,null,8
    union all select 5,null,7
    union all select 6,6,4
    union all select 7,7,5
    union all select 8,8,6
    union all select 9,9,3
    union all select 10,10,2
    union all select 11,11,1select * from #tbupdate #tb set a2=a3
    where a1<=5select * from #tb
    drop table #tb
    /*
    a1 a2 a3
    1 11 11
    2 10 10
    3 9 9
    4 8 8
    5 7 7
    6 6 4
    7 7 5
    8 8 6
    9 9 3
    10 10 2
    11 11 1
    */
      

  3.   

    if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
    go
    create table #temp( [a1] varchar(100), [a2] varchar(100), [a3] varchar(100));
    insert #temp
    select '1',null,'11' union all
    select '2',null,'10' union all
    select '3',null,'9' union all
    select '4',null,'8' union all
    select '5',null,'7' union all
    select '6','6','4' union all
    select '7','7','5' union all
    select '8','8','6' union all
    select '9','9','3' union all
    select '10','10','2' union all
    select '11','11','1' --SQL:
    ;WITH cte AS
    (
    SELECT a.a2, newa2= b.a2 FROM
    (SELECT rowid=ROW_NUMBER() OVER(ORDER BY a1),* FROM #temp WHERE a2 IS NULL) a
    INNER JOIN
    (select TOP(5) rowid=ROW_NUMBER() OVER(ORDER BY a3), a2 from #temp WHERE a1>5) b
    ON a.rowid = b.rowid
    )
    update cte
    SET a2 = newa2SELECT * FROM #temp
    /*
    a1 a2 a3
    1 11 11
    2 10 10
    3 9 9
    4 6 8
    5 7 7
    6 6 4
    7 7 5
    8 8 6
    9 9 3
    10 10 2
    11 11 1
    */
      

  4.   


    把a1>5的列的a2值按a3排序之后 取前五个 更新到A2 为空的那地方去
    这句话你确认你看懂了?
      

  5.   

    --SQL:
    ;WITH cte AS
    (
        SELECT a.a2, newa2= b.a2 FROM
        (SELECT rowid=ROW_NUMBER() OVER(ORDER BY a1),* FROM #temp WHERE a2 IS NULL) a --#1.取出要更新的数据,每条记录也赋予一个唯一rowid值(这个rowid值,我是按a1排序生成的)
        INNER JOIN
        (select TOP(5) rowid=ROW_NUMBER() OVER(ORDER BY a3), a2 from #temp WHERE a1>5) b --#2.找到符合条件的前5条记录,并且按顺序给每条记录生成一个rowid(1,2,3,4,5)
        ON a.rowid = b.rowid --#1,#2中查询出来的记录按rowid来关联,一一对应.
    )
    update cte --这儿用了一个方法.即:用CTE来更新查询出来的结果集.(当CTE查询出结果集后,可把这个结果集当成一个独立的表来更新,更新数据自动反映到基表,但有一定的限制,具体查看MSDN)
    SET a2 = newa2
      

  6.   

    把a1>5的列的a2值按a3排序之后 取前五个 更新到A2 为空的那地方去
    这句话你确认你看懂了?
    -------------------------
    a3是什么排序的?
    你这样写让人有些岐义,而且给出的结果和a3顺排序一样
      

  7.   

    UPDATE  dbo.testtable
    SET     a2 = c.a2
    FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY b.a3 ) rownum ,
                        b.a2
              FROM      dbo.testtable a
                        INNER JOIN dbo.testtable b ON a.a1 = b.a1
                                                      AND b.a1 > 5
            ) c
            INNER JOIN ( SELECT ROW_NUMBER() OVER ( ORDER BY a1 ) rownum,e.a1
                         FROM   dbo.testtable  e
                         WHERE e.a2 IS NULL
                       ) d ON c.rownum = d.rownum
    WHERE dbo.testtable.a1=d.a1