0

以下是我的表包含的记录。我想删除所有重复的行,结果必须包含 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
4

3 回答 3

0

使用MIN(rowid)

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

请参阅此链接,这将向您展示从表中删除重复数据的不同方法。

于 2013-10-07T05:19:43.530 回答
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()确定要删除的行;你想删除第二个,第三个等等,即rnum > 1。我使用 rowid 是因为您的表上似乎没有主键(这是个好主意吗?)。

于 2013-10-06T19:42:08.897 回答
0

oracle 中相同行之间的不同之处在于,所有行都有唯一的 rowid,因为您可以使用 rowid 的 min 或 max 并按所有列分组查询是这样的:

DELETE FROM tableName
WHERE ROWID NOT IN (SELECT MAX (ROWID)
                 FROM   tableName
                 GROUP BY ID, NAME, place
                 );
于 2013-10-07T06:52:47.223 回答