如何删除重复行保持其他唯一行活着?

时间:2013-10-06 18:31:03

标签: database oracle

以下是我的表中包含的记录。我想删除所有重复的行,结果必须包含ID为50,10,20,30,40的行。

由于

50 Engineering    Pune
50 Engineering    Pune
50 Engineering    Pune
50 Engineering    Pune
50 Engineering    Pune
50 Engineering    Pune
50 Engineering    Pune
50 Engineering    Pune
50 Engineering    Pune
10 ACCOUNTING     NEW YORK
20 RESEARCH       DALLAS
30 SALES          CHICAGO
40 OPERATIONS     BOSTON

3 个答案:

答案 0 :(得分:0)

我想我会这样做:

http://sqlfiddle.com/#!4/f0ea9/7

delete example
where rowid in (
    select r_id
    from (
        select 
            rowid r_id, 
            row_number() over(partition by e.dep_id, e.dep_name, e.place order by e.dep_id) rnum
        from example e
    )
    where rnum > 1
);

分析函数row_number() over()确定要删除的行;你想要删除第2个,第3个等等,即rnum > 1。我使用rowid因为你的桌子上似乎没有主键(这是一个好主意吗?)。

答案 1 :(得分:0)

使用MIN(rowid)

DELETE FROM table
 WHERE ROWID NOT IN (SELECT MIN (ROWID)
                     FROM   table
                     GROUP BY ID, NAME, place
                     );

请参阅此link,这将显示从表中删除重复数据的不同方法。

答案 2 :(得分:0)

oracle中相同行之间的不同之处在于所有行都有唯一的rowid 你可以在你的所有列中使用groupid的min或max 查询是这样的:

DELETE FROM tableName
WHERE ROWID NOT IN (SELECT MAX (ROWID)
                 FROM   tableName
                 GROUP BY ID, NAME, place
                 );