Oracle:为什么我不能在delete子句中依赖ROWNUM

时间:2016-01-22 13:51:29

标签: sql oracle rownum

我有这样的声明:

SELECT MIN(ROWNUM) FROM my_table
GROUP BY NAME 
HAVING COUNT(NAME) > 1);

此语句为我提供了第一个副本的rownum,但是当将此语句转换为DELETE时,它只删除所有内容。为什么会这样?

2 个答案:

答案 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或其他字段的记录。