我有这样的声明:
SELECT MIN(ROWNUM) FROM my_table
GROUP BY NAME
HAVING COUNT(NAME) > 1);
此语句为我提供了第一个副本的rownum
,但是当将此语句转换为DELETE
时,它只删除所有内容。为什么会这样?
答案 0 :(得分:2)
这是因为ROWNUM是一个伪列,暗示它们不是物理存在的。您可以更好地使用rowid
删除记录。
要删除重复项,您可以尝试这样:
DELETE FROM mytable a
WHERE EXISTS( SELECT 1 FROM mytable b
WHERE a.id = b.id
AND a.name = b.name
AND a.rowid > b.rowid )
答案 1 :(得分:0)
使用rownum
删除重复记录没有多大意义。如果您需要删除重复的行,只为name
的每个值留下一行,请尝试以下操作:
DELETE FROM mytable
WHERE ROWID IN (SELECT ID
FROM (SELECT ROWID ID, ROW_NUMBER() OVER
(PARTITION BY name ORDER BY name) numRows FROM mytable
)
WHERE numRows > 1)
通过在ORDER BY
子句中添加更多列,您可以选择删除具有最大/最小ID
或其他字段的记录。