|
如何删除数据库中的冗余数据(翻译) (8) GROUP BY LastName, FirstName; 这一条命令的输出 Listing 5. Output of MIN() query 这一条命令显示了所有的非冗余的数据,其它的行则应该被删除 ID LASTNAME FIRSTNAME ----- --------------- ---------- 1018 Blake Becky 1013 Blue Don 1000 Bradley Tom 1002 Chang Jim 1008 Griffith David 1020 Hill Larry 1004 King Chuck 1005 Krieger Jeff 1003 Loney Julie 1007 Lord Don 1015 Mason Paul 1006 Monroe John 1009 Simon Michael 1001 Stone Tony
14 rows selected.
这样你就可以删除那些不在这个表中的所有的行,同样将上一条语句作为一个子查询,构造一个语句
DELETE FROM Customers WHERE ID NOT IN (SELECT MIN(ID) FROM Customers GROUP BY LastName, FirstName);
尽管如此,理论是可行的,但是这个方案并不是那么有效,因为这样一来,DBMS要完成两个表的扫描来完成这项任务,对于大量的数据来说,这简直是不可行的,为了测试他的性能,我创建了Customer表,大约有5000,000行,45,000冗余行,(9%)以上这个命令运行了一个小时,没有输出结果,它耗尽了我的耐心,所以我杀死了这个进程 这个方案的令外这个方案还有一个缺点,你不能控制每一个组中你要保留的行
一种PL/SQl解决方案:使用存储过程删除冗余数据,叫做DeleDuplicate的存储过程,这个过程的结构很清晰的. SQL Listing 6. The DeleteDuplicate stored procedure
它将这些冗余行选择一到一个游标中,然后从表中取出每一个冗余行来进行与游标中的行进行比对,然后决定是否删除
|