这个oracle SQL命令如何工作?

时间:2014-02-25 19:32:50

标签: sql oracle command

我知道,它删除了所有重复的行,但我无法检查它。以下代码如何工作?

DELETE grades 
 WHERE rowid NOT IN (SELECT MAX(rowid) 
                       FROM grades 
                      GROUP BY grades);

3 个答案:

答案 0 :(得分:1)

嗯,显然,你有一个表GRADES,列GRADESSELECT将标识每个等级的最大rowid(GROUP BY GRADES)。这为GRADES的每个唯一值提供了一行。然后,DELETE将删除您在SELECT生成的rowid列表中不存在的任何行。

最终结果是,每个唯一GRADES值最终只有一行。这意味着将删除所有重复项。

希望这很清楚。

答案 1 :(得分:1)

DELETE grades WHERE rowid NOT IN (SELECT MAX(rowid) FROM grades GROUP BY grades);

ROWID列是一个哈希值,表示数据存储位置的哈希值。每次将值插入表时,Oracle都会使用该值来增加该值。因此,最后一个是最大值。

SELECT MAX(rowid) FROM grades GROUP BY grades

因此,此查询选择表中插入的最后一个值,group by允许您在grades的所有相同值中识别单个值。

DELETE grades WHERE ...

最后,删除所有未选中的值,即所有未插入的值,所有重复的值都被插入。

答案 2 :(得分:0)

在Oracle中,rowid永远不会重复。 rowid是Oracle的唯一(内部)行标识符。

由于我认为成绩表不是一个庞大的表,并且不涉及外键关系,你可以简单地这样做:

create table grades_temp as select distinct * from grades;
delete from grades;
insert into grades select * from grades_temp;
drop table grades_temp;

您还应该在成绩表上声明主键和唯一索引,以避免将来插入重复数据。