使用 Oracle SQL 删除重复数据并保留最新记录不起作用
Delete duplicate data and keep the latest record using Oracle SQL not working
我有 VK_MODIFY
table,我想通过 ORDERID
和 EXTORID
的组合删除所有重复数据,只保留最新的 SYSTEM_INSERTED_AT
.
[![在此处输入图片描述][1]][1]
我尝试了以下查询,但它无法正常工作:
DELETE FROM VK_MODIFY a
WHERE rowid not in
(SELECT min(rowid)
FROM VK_MODIFY b
where a.ORDERID = b.ORDERID and a.EXTORID = b.EXTORID);
试试这个:
DELETE FROM VK_MODIFY a
WHERE SYSTEM_INSERTED_AT not in
(SELECT max(SYSTEM_INSERTED_AT)
FROM VK_MODIFY b
where a.ORDERID = b.ORDERID and a.EXTORID = b.EXTORID);
根据您的架构(索引,....),可能会有更快的解决方案。
这是另一个可以解决您问题的例子。
DELETE FROM VK_MODIFY WHERE ROWID IN(SELECT TEMP.ROWID FROM(
SELECT ROWID,ORDERID, EXTORID, SYSTEM_INSERTED_AT,
ROW_NUMBER()OVER (PARTITION BY ORDERID,EXTORID ORDER BY SYSTEM_INSERTED_AT DESC) RN FROM VK_MODIFY
)TEMP
WHERE TEMP.RN <> 1)
最佳做法是您的 table 中应该有一个主键字段,如果有,您可以使用此字段而不是 rowid。
我有 VK_MODIFY
table,我想通过 ORDERID
和 EXTORID
的组合删除所有重复数据,只保留最新的 SYSTEM_INSERTED_AT
.
[![在此处输入图片描述][1]][1]
我尝试了以下查询,但它无法正常工作:
DELETE FROM VK_MODIFY a
WHERE rowid not in
(SELECT min(rowid)
FROM VK_MODIFY b
where a.ORDERID = b.ORDERID and a.EXTORID = b.EXTORID);
试试这个:
DELETE FROM VK_MODIFY a
WHERE SYSTEM_INSERTED_AT not in
(SELECT max(SYSTEM_INSERTED_AT)
FROM VK_MODIFY b
where a.ORDERID = b.ORDERID and a.EXTORID = b.EXTORID);
根据您的架构(索引,....),可能会有更快的解决方案。
这是另一个可以解决您问题的例子。
DELETE FROM VK_MODIFY WHERE ROWID IN(SELECT TEMP.ROWID FROM(
SELECT ROWID,ORDERID, EXTORID, SYSTEM_INSERTED_AT,
ROW_NUMBER()OVER (PARTITION BY ORDERID,EXTORID ORDER BY SYSTEM_INSERTED_AT DESC) RN FROM VK_MODIFY
)TEMP
WHERE TEMP.RN <> 1)
最佳做法是您的 table 中应该有一个主键字段,如果有,您可以使用此字段而不是 rowid。