id  name
--------
100 aa
100 aa
200 bb
200 bb请问ORACLE的SQL怎么写,重复的数据只留一条,哪位高手帮忙解决一下,谢谢!

解决方案 »

  1.   

    DELETE FROM TAB_NAME A WHERE NOT EXISTS(SELECT 1 FROM (
    SELECT ID,NAME,MAX(ROWID) ROW_ID FROM TAB_NAME GROUP BY ID,NAME) B WHERE A.ID=B.ID AND A.NAME=B.NAME AND A.ROWID=B.ROW_ID);
      

  2.   

    select id,name
     from ( 
    select id,name
           rank() over(partition by id,name order by id,name) num
     from table)
    where num =1;楼上的方法也可以,偶这个方法是查询出唯一不重复记录,楼主可以参考参考
      

  3.   

    去重复的方法很多,
    普通的写法delete from a where a.rowid < (select max(b.rowid) from a b where a.id = b.id)再有,就是上面的分析函数 ,或者 row_number
      

  4.   

    如果数据记录不是很多的情况下,可以通过中间表来实现。
    实测数据:-- 删除重复的记录
    CREATE TABLE T143
    (
        ID NUMBER(4),
        NAME VARCHAR2(20)
    );
    INSERT INTO T143 VALUES(100, 'AA');
    INSERT INTO T143 VALUES(100, 'AA');
    INSERT INTO T143 VALUES(200, 'BB');
    INSERT INTO T143 VALUES(200, 'BB');
    INSERT INTO T143 VALUES(200, 'CC');
    INSERT INTO T143 VALUES(300, 'DD');-- 方法1(使用中间表)
    -- 1.创建中间表
    CREATE TABLE T144
    (
        ID NUMBER(4),
        NAME VARCHAR2(20)
    );
    -- 2. 将数据保存到中间表
    INSERT INTO T144
    SELECT DISTINCT * FROM T143;
    -- 3. 删除原表中所有数据
    TRUNCATE TABLE T143;
    -- 4. 从中间表中拷贝回数据
    INSERT INTO T143 SELECT * FROM T144;
    结果:
      

  5.   

    多谢谢大家,现在才知道有ROWID这个东西,呵呵!
      

  6.   

    SELECT DISTINCT * FROM TB
      

  7.   

    select DISTINCT* from  table  
    然后 创建表 2  
    然后插入到表2  然后删除表1 
      

  8.   

      delete from table where rowid not in (select min(rowid) from table group by栏位名)
      

  9.   

    这个方法很多。
    delete from table_name a where rowid >( select min(rowid) from table_name b where a.id=b.id  )