假设我有A表,里面有id ,name,code,chengji字段
现在我要按名字分组,更新按名字分组后的前两行的code字段为"101".
比如: id  name  code  chengji
      1   刘德华 90     90
      2   刘德华 81     70
      3   刘德华 100     70
      4   张学友 91     70  
       5   张学友 90     80 
更新后的结果是
      id  name  code  chengji
      1   刘德华 101     90
      2   刘德华 101     70
      3   刘德华 100     70
      4   张学友 101     70  
      5   张学友 101     80 

解决方案 »

  1.   


    DROP TABLE test;
    CREATE TABLE test (id INT, NAME VARCHAR2(20),  code INT, chengji INT);INSERT INTO TEST VALUES (1, '刘德华', 90, 90);
    INSERT INTO TEST VALUES (2, '刘德华', 81, 70);
    INSERT INTO TEST VALUES (3, '刘德华', 100, 70);
    INSERT INTO TEST VALUES (4, '张学友', 91, 70);
    INSERT INTO TEST VALUES (5, '张学友', 90, 80);
    COMMIT;
    SELECT ID,
           NAME,
           CASE
             WHEN RN <= 2 THEN
              101
             ELSE
              CODE
           END,
           CHENGJI
      FROM (SELECT ID,
                   NAME,
                   CODE,
                   CHENGJI,
                   ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) RN
              FROM TEST);
    输出:
    1 刘德华 101 90
    2 刘德华 101 70
    3 刘德华 100 70
    4 张学友 101 70
    5 张学友 101 80
      

  2.   

    TRY IT ..
    SQL> SELECT * FROM TEST_22;       SID SNAME                      CODE    CHENGJI
    ---------- -------------------- ---------- ----------
             1 ANDY                         90         90
             2 ANDY                         81         70
             3 ANDY                        100         70
             4 ZHANG                        91         70
             5 ZHANG                        90         80SQL> 
    SQL> UPDATE TEST_22 TT
      2     SET TT.CODE = 101
      3   WHERE EXISTS (SELECT *
      4                   FROM TEST_22 T1
      5                  WHERE (
      6                         SELECT COUNT(1)
      7                           FROM TEST_22 T2
      8                          WHERE T1.SNAME = T2.SNAME
      9                            AND T1.SID > T2.SID
     10                        ) <= 1
     11                    AND TT.SID = T1.SID);4 rows updatedSQL> COMMIT;Commit completeSQL> SELECT * FROM TEST_22;       SID SNAME                      CODE    CHENGJI
    ---------- -------------------- ---------- ----------
             1 ANDY                        101         90
             2 ANDY                        101         70
             3 ANDY                        100         70
             4 ZHANG                       101         70
             5 ZHANG                       101         80SQL> 
      

  3.   

    借用二楼的数据update test a set code=
    (select case when tt<3 then '101' else to_char(code) end from 
    (select id,
            name,
            code,
            chengji,
            row_number() over(partition by name order by id) tt
            from test) b where a.id=b.id)
     where exists(select 1 from test b
     where a.id=b.id)结果为:
    1 1 刘德华 101 90
    2 2 刘德华 101 70
    3 3 刘德华 100 70
    4 4 张学友 101 70
    5 5 张学友 101 80
      

  4.   

    谢谢啊,不过over函数怎么用的啊!
    我sql比较差,看样子还得看书去啊
      

  5.   

    up 1楼
    如果不用case when可以用decode()
    decode(rn,1,'101',2,'101',code)