我知道,它删除了所有重复的行,但我无法检查它。以下代码如何工作?
DELETE grades
WHERE rowid NOT IN (SELECT MAX(rowid)
FROM grades
GROUP BY grades);
答案 0 :(得分:1)
嗯,显然,你有一个表GRADES
,列GRADES
。 SELECT
将标识每个等级的最大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;
您还应该在成绩表上声明主键和唯一索引,以避免将来插入重复数据。