在SQL中使用rownum删除重复记录
请帮助我了解基于rownum的删除记录,即使id重复,也不会发生,但是如果是这样的话。
select rownum,a.* from a;
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
4 1 leo_1
5 2 leo_2
6 3 leo_3
查询已尝试,但删除所有6行。
DELETE FROM a
WHERE rownum not in
(SELECT MIN(rownum)
FROM a
GROUP BY name);
但是此查询给出正确的结果:
SELECT MIN(rownum)
FROM a
GROUP BY name
ROWNUM
----------
1
2
3
预期结果 :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
-
使用
rowid
DELETE FROM table_name a WHERE EXISTS( SELECT 1 FROM table_name b WHERE a.id = b.id AND a.name = b.name AND a.rowid > b.rowid )
当然,您也可以这样做
a.rowid < b.rowid
。该rowid
所以你是否删除具有较大的行或较小的地址不要紧只是该行的物理地址。但是,您的预期结果没有任何意义。
Expected Result : ROWNUM ID NAME ---------- ---------- ---------- 4 1 leo_1 5 2 leo_2 6 3 leo_3
该
rownum
结果集的总是在查询时分配。这意味着rownum
在不同的查询中(或同一查询多次运行时)特定的行可能会以不同的值出现。
rownum
始终是顺序的,因此rownum
在同一结果集中没有rownum
1、2和3的值的情况下,结果集中永远不会有a的4
。无论您删除哪个重复行,您的结果都将是预期结果 :
ROWNUM ID NAME ---------- ---------- ---------- 1 1 leo_1 2 2 leo_2 3 3 leo_3
但是这些
rownum
值是任意的。Oracle返回同样有效预期结果 :
ROWNUM ID NAME ---------- ---------- ---------- 1 2 leo_2 2 3 leo_3 3 1 leo_1