|
如何删除数据库中的冗余数据(翻译) (10) DBMS_OUTPUT.PUT_LINE(TO_CHAR(vCounter) ' duplicates have been deleted.');
EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error ' TO_CHAR(SQLCODE) ': ' SQLERRM); ROLLBACK;
END DeleteDuplicates;
它将冗余数据选择到一个游标中,并根据(LastName,FirstName)来分组(在我们这个方案中),然后打开游标然后循环地取出每一行,然后用与先前的取出的键值进行比较,如果这是第一次取出这个值,或者这个值不是冗余键,那么跳过这个记录然后取下一个,不然的话,这就是这个组中的冗余记录,所以删掉它. 让我们运行一下这个存储过程 BEGIN DeleteDuplicates; END; /
SELECT LastName, FirstName, COUNT(*) FROM Customers GROUP BY LastName, FirstName HAVING COUNT(*) > 1;
最后一个查询语句没有返回值,所以冗余数据没有了从表中取冗余数据的过程完全是由定义在csr_Duplicates 这个游标中的SQL语句来实现的,PL/SQl只是用来实现删除冗余数,那么能不能完全用SQL语句来实现呢?
二.SQL解决方案,使用RANK()删除冗余数据 Oracle8i分析函数RANK()来枚举每一个组中的元素,在我们的方案中, 我们应用这个方案,我们使用这个函数动态的把冗余数据连续的排列起来加上编号,组由Partintion by 这个语句来分开,然后用Order by 进行分组 SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName, FirstName ORDER BY ID) SeqNumber FROM Customers ORDER BY LastName, FirstName;
SQL Listing 7. Output of single SQL statement that uses RANK() 显示的是根据记录的条数的个数来显示尤其对于冗余数据 ID LASTNAME FIRSTNAME SEQNUMBER ----- --------------- ---------- ---------- 1018 Blake Becky 1
|