我有一张表,里面共有12列,我现在需要找出指定列中指定字段的重复值,并将重复值删除,保留唯一。
姓名 年龄 职业 地区
张三 10 合格 西安
张三 10 合格 西安
张三 10 合格 西安
李四 12 合格 西安
李四 12 合格 西安
王五 15 合格 西安
王五 15 合格 西安
王五 15 合格 西安
王五 15 合格 西安
马六 20 合格 西安
马六 20 合格 西安
候七 25 合格 西安
张三 10 合格 咸阳
张三 10 合格 咸阳
张三 10 合格 咸阳
李四 12 合格 咸阳
李四 12 合格 咸阳
王五 15 合格 咸阳
王五 15 合格 咸阳
王五 15 合格 咸阳
王五 15 合格 咸阳
马六 20 合格 咸阳
马六 20 合格 咸阳
候七 25 合格 咸阳
张三 10 合格 宝鸡
张三 10 合格 宝鸡
张三 10 合格 宝鸡
李四 12 合格 宝鸡
李四 12 合格 宝鸡
王五 15 合格 宝鸡
王五 15 合格 宝鸡
王五 15 合格 宝鸡
王五 15 合格 宝鸡
马六 20 合格 宝鸡
马六 20 合格 宝鸡
候七 25 合格 宝鸡
比如上表,我要找出所有西安区域内的姓名重复的值,并保留唯一。执行完之后的效果是
姓名 年龄 职业 地区
张三 10 合格 西安
李四 12 合格 西安
王五 15 合格 西安
马六 20 合格 西安
候七 25 合格 西安
张三 10 合格 咸阳
张三 10 合格 咸阳
张三 10 合格 咸阳
李四 12 合格 咸阳
李四 12 合格 咸阳
王五 15 合格 咸阳
王五 15 合格 咸阳
王五 15 合格 咸阳
王五 15 合格 咸阳
马六 20 合格 咸阳
马六 20 合格 咸阳
候七 25 合格 咸阳
张三 10 合格 宝鸡
张三 10 合格 宝鸡
张三 10 合格 宝鸡
李四 12 合格 宝鸡
李四 12 合格 宝鸡
王五 15 合格 宝鸡
王五 15 合格 宝鸡
王五 15 合格 宝鸡
王五 15 合格 宝鸡
马六 20 合格 宝鸡
马六 20 合格 宝鸡
候七 25 合格 宝鸡

解决方案 »

  1.   


    SQL> create table test(id int, name varchar(10));
    Table created
    SQL> begin
      2      insert into test values(1,'zhangsan');
      3      insert into test values(1,'zhangsan');
      4      insert into test values(1,'zhangsan');
      5      insert into test values(2,'lisi');
      6      insert into test values(2,'lisi');
      7      insert into test values(2,'lisi');
      8  end ;
      9  /
    PL/SQL procedure successfully completed
    SQL> delete test t
      2  where exists (
      3  select rowid from test
      4   where id = t.id and t.name = name and t.rowid > rowid
      5  ) ;
    4 rows deleted
    SQL> /
    0 rows deleted
    SQL> select * from test ;
                                         ID NAME
    --------------------------------------- ----------
                                          1 zhangsan
                                          2 lisi
    SQL> drop table test purge ;
    Table droppedSQL> 
      

  2.   

    --查找重复
    select  姓名,年龄,职业,地区 from table 
    where 地区 ='西安'
    group by 姓名,年龄,职业,地区
    having count(1) >1;--删除重复
    delete table
     where (姓名,年龄,职业,地区,rowid)=(select  姓名,年龄,职业,地区,max(rowid) from table group by 姓名,年龄,职业,地区)
      

  3.   


    你这样删除不全吧,如果有多余两条的重复呢,另外,当子查询返回多行时还会报错哦,思路是要保留max rowid的那一行
      

  4.   

    delete table
     where (姓名,年龄,职业,地区,rowid)  not in (select  姓名,年龄,职业,地区,max(rowid) from table group by 姓名,年龄,职业,地区)
      

  5.   


    在哪里体现是删除指定字段内的重复值
    这样看的清楚些,通过rowid确定唯一行,删除其他重复的行。
    delete table
     where rowid  not in (select  max(rowid) from table group by 姓名,年龄,职业,地区)
       and 地区 ='西安';
      

  6.   


    delete from table where rowid not in (select max(rowid) from table group by field1,field2,... )