从列中删除重复数据

时间:2014-01-08 10:14:22

标签: oracle duplicates duplicate-removal

我有一个包含以下结构的表

    Id  Pro_id      name        price
    ----------------------------------------
    1   001          ABC        200
    1   002          XYZ        100
    1   003          XYZ        150
    2   004          PQR        100
    2   005          PQR        100
    2   006          LMN        200
    2   007          LMN        300
    2   008          DEF        150

正如您所看到的,名称'中有一些重复的名称。列。
我想删除所有重复的名称(只需要保留第一个输入的名称并删除剩余的名称)

所以我的表应该看起来像 -

Id  Pro_id      name        price
----------------------------------------
1   001         ABC          200
1   002         XYZ          100
2   004         PQR          100
2   006         LMN          200
2   008         DEF          150

我尝试了以下来获取重复的名称 -

SELECT ID, NAME, count(NAME) FROM TABLENAME
GROUP BY ID, NAME HAVING count(NAME)>1

但现在我无法继续前进,坚持如何删除记录。

任何想法?

4 个答案:

答案 0 :(得分:2)

您可以尝试以下SQL(在MySQL中可行)

delete t1.* from tablename t1
    inner join
tablename t2 ON t1.name = t2.name
    AND t1.Pro_id > t2.Pro_id

答案 1 :(得分:1)

SQL中没有“first”,因为select的顺序通常是未定义的,因此以下内容将为重复的名称保留最小值为Pro_id的条目,但您可以自由定义不同的聚合器:

DELETE FROM tablename 
WHERE Pro_id NOT IN (SELECT MIN(Pro_id) FROM tablename GROUP BY name);

答案 2 :(得分:1)

 DELETE FROM table_name
 WHERE rowid NOT IN
               ( 
                 SELECT MIN(rowid)
                 FROM table_name
                 GROUP BY column1, column2, column3...
               ) ;

答案 3 :(得分:0)

您可以尝试这样的事情

delete from table1 
where rowid in 
( 
    select rid
    from  
        (
        select  rowid as rid, 
                row_number() over (partition by name order by pro_id) as rn
        from    table1
        )
    where rn > 1
)

没有测试过它