oracle中 怎样删除某个列相同的记录:
比如有个person表,表中有person_id,person_name两个字段,名字有重复的,当做select查询时怎样
去除名字相同的记录,只保留一条。

解决方案 »

  1.   

    delete person where rowid in (select * from person  group by person_id,person_name)
      

  2.   

    delete person where rowid in (select rowid from person  group by person_id,person_name)
      

  3.   

    delete person where rowid in (select min(rowid) from person  group by person_id,person_name)  ...............这个....今天鼠标老不好使了
      

  4.   

    在MSSQL中,用in的话,效率会很低,
    在Oracle中我没测试过,如果低的话可以用下面的语句delete from test a
    where not exists
    (
    select id 
    from (
     select min(rowid) as id 
        from test
        group by person_name
        ) b
        where b.id = a.rowid
    )
      

  5.   

    SELECT DISTINCT person_id,person_name 
      FROM person;
      

  6.   

    用group by 子句报“不是group by子句”的错误,用delete会删除表的数据,我要的是只在结果集中去掉name字段重复的记录,而数据库中的记录不能删除,用distinct只能去掉所有字段的值完全相同的记录。
      

  7.   

    SELECT DISTINCT first_value(person_id) over(partition by person_name),person_name
      FROM person;
      

  8.   

    看LZ的意思是有名字相同但ID不同的记录。
    那么用GROUP BY NAME时,SELECT 后面也只能选择NAME。
    如果选了其他的,比如ID,那么必须GROUP BY ID,NAME,
    实际上 这样就和DISTINCT起同样的效果了。但是我还有疑问,一个名字有多个ID,你现在只想选择出一个,
    那么从多个ID选择一个的规则又是什么呢?比如第一个?
      

  9.   

    你只是查询啊..........select a.*  from person a
    where  exists
    (
    select id 
    from (
     select min(rowid) as id 
        from person
        group by personid,personname
        ) b
        where b.id = a.rowid
    )
      

  10.   

    SELECT DISTINCT first_value(person_id) over(partition by person_name),person_name
      FROM person 
    这个方法解决了,不知什么什么意思?
      

  11.   

    FIRST_VALUE是Oracle的分析函数,这句的意思是:按照person_name分组,对于每个person_name,都返回本组的第一个值(first_value),然后利用distinct将不同的person_name
    选择出来。可以查查Oracle的SQL函数,其中的analytic function部分对此有详细的介绍。