请帮助我知道根据 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
Use the 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
The rownum
结果集的值总是在查询时分配。这意味着特定行可能会以不同的方式出现rownum
不同查询中的值(或多次运行同一查询时)。rownum
总是连续的,所以你永远不可能有一个rownum
结果集中有 4 个,但也没有rownum
同一结果集中的 1、2 和 3 的值。无论您删除哪一个重复行,您的结果都将是
预期结果 :
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
But the rownum
值是任意的。 Oracle 返回同样有效
预期结果 :
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)