是否可以使用 ROWID 或其他方法从 Oracle SQL 表中删除一式三份或一式四份?



我知道可以使用以下示例表单中的ROWID从表中删除重复项:

DELETE FROM TABLE_NAME 
WHERE ROWID IN 
(SELECT
MIN(ROWID)
FROM TABLE_NAME
WHERE ...
GROUP BY COLUMN_NAME_1, COLUMN_NAME_2, etc. ) 

我想知道是否可以对出现超过 2 次的条目执行此操作。如果没有,还有其他方法可以做吗?

我不会使用not in,甚至不会使用minmax。我通常使用类似的东西

delete demo where rowid in
( select lead(rowid) over(partition by your_grouping_column order by col1, col2)
from demo )

lead(rowid)col1, col2顺序返回所有"下一个"rowid。每个your_grouping_column的第一行(无论是什么(都不会在该列表中。

如果要保留最新的 rowid

您可以按所有列使用 NOT IN for max(rowid( 组

DELETE FROM TABLE_NAME 
WHERE ROWID NOT IN 
(SELECT
MAX(ROWID)
FROM TABLE_NAME
WHERE...
GROUP BY COLUMN_NAME_1, COLUMN_NAME_2, etc. )

我不知道以下是否是一个有效的答案。如果是这样,请告诉我。

假设Table_V1是包含重复项的那个,我创建了它的第二个版本,其中包括原始数据旁边的重复项计数

CREATE TABLE Table_V2 AS ( SELECT A.*, B.CNT FROM Table_V1 A LEFT JOIN (SELECT * FROM (SELECT COL1, COL2, COUNT(COL1) AS CNT FROM Table_V1 GROUP BY COL1, COL2) WHERE CNT>1) B ON A.COL1 = B.COL1 AND A.COL2 = B.COL2);

然后我使用以下行删除重复/三份/四份等:

DELETE FROM Table_V2 WHERE CNT IS NOT NULL AND ROWID NOT IN ( SELECT MAX (ROWID) FROM Table_V2 WHERE CNT IS NOT NULL GROUP BY COL1, COL2);

最新更新