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