假如又如下的表A.name age address
----------------
aa1  10  asas
aa1  20  asasas
aaa1 50  dsd
bb1  10  asads
bb1  30  asasdas
...  ..  ........name相同的数据都为2条,也有name唯一的数据。
现在希望通过SQL语句实现
将名字相同的记录中age较大一条的age赋给age较小的,然后删除修改之前age较大的那条记录。
如:
之前:
aa1  10  asas
aa1  20  asasas之后:
aa1  20  asas其他名字相同记录相同处理.
谢谢.

解决方案 »

  1.   

    很烦,我只是给你一个思路利用   
     row_number() over(partition by name order by age desc)
    这样后面就会有个排序号了,
    取排序号为2的 age 赋值给排序号为1的age且名字相同
    最后删除排序号为2的记录就可以了
      
      

  2.   

    先建个字段,存放楼上说的内容
    然后update 编号为1 的age 为编号为2的内容
    然后删除编号为2的
    最后可以把这个字段删除
      

  3.   

    --创建较大年龄临时表
    create tablename1 as select name,age,address from tablename where (name,age) in (select name ,max(age) from tablename group by name having count(*)>1);
    --更新age
    update tablename a set age=(select age from tablename1 where name=a.name )
      where name in (select name from tablename1);
    --删除多余数据
    delete tablename where (name,age,address) in (select name,age,address from tablename1);
    --删除临时表
    drop table tablename1;
      

  4.   

    直接对表进行更新:
    UPDATE (SELECT /*+BYPASS_UJVC*/
             T1.AGE,
             J1.MAX_AGE
              FROM TEST T1,
                   (SELECT T1.NAME,
                           MIN(T1.AGE) AS MIN_AGE,
                           MAX(T1.AGE) AS MAX_AGE
                      FROM TEST T1
                     GROUP BY T1.NAME) J1
             WHERE T1.NAME = J1.NAME)
       SET AGE = MAX_AGE
    利用这个更新语句,把数据更新后再delete掉没有用的就可以了.
    注:其中的TEST表是作为测试表,楼主根据实际表的名称更改一下SQL就可以了.