</p> 现在只用了47秒钟的就完成的上面的任务,比起上一个136秒,这是一个很大的进步,相比之下,存储过程用了56秒,这样存储过程有些慢了使用PL/SQL语句我们和我们以上的代码,会得到更好的更精确的代码,和提高你代码的执行效率,虽然对于从数据库中枚举数据PL/SQL对于Sql两者没有什么差别,但是对于数据的比较上,PL/SQL就比SQL要快很多,但是如果冗余数据量比较小的话,我们尽量使用SQL而不使用PL/SQL如果你的数据表没有主键的话,那么你可以参考其它技术( E1 |4 _! s) B* r5 Y( K/ a% G
Rank()其它的方法, G: r! s7 f" B2 |
使用Rank()函数你可以对选择你所保留的数据,(或者是小ID的或者是大ID 的,就由RECDate这个列来决定这种情况下,你可以把REcdate加入到(Orderby )子句中,倒序或者正序
( A8 S4 w, @* z4 q" g9 P2 e7 y 这是一种保留最大Id的一种解决方案, a- \3 J1 X! p* s: B5 c
DELETE% |6 {; L9 }! R: a, \/ O
FROM Customers
. h6 x9 M$ S9 X5 @3 ~; z, d WHERE ID IN
4 @; A# R( s* k, P0 v (SELECT ID6 b j7 @& [$ w
FROM
# W; b3 U$ z7 R9 E1 y (SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName, FirstName ORDER BY RecDate DESC, ID) AS SeqNumber
6 v3 e0 \8 w- t, _, ?! Q) q FROM
h# |' `2 \! k- T0 m (SELECT ID, LastName, FirstName, RecDate4 P8 q* P" V8 n, I! y
FROM Customers
% O9 k/ [# p4 S* r7 Q2 y/ i WHERE (LastName, FirstName) IN (SELECT LastName, FirstName* M" r) V# w# b; G
FROM Customers) R# { G2 P. ?/ R: T. ]9 {
GROUP BY LastName, FirstName6 {% j% j! q/ B+ Y! O$ ?
HAVING COUNT(*) > 1)))) w. F3 \: p9 d9 A( ?- k, f/ w2 w
WHERE SeqNumber > 1);" s- |* b9 k j, A
这种技术保证了你可以控制每一个表中的保留的组,假设你有一个数据库,有一个促销或者有一个折扣信息,比如一个团体可以使用这种促销5次,或者个人可以使用这个折扣三次,为了指出要保留的组的个数,你可以在where 和having子句中进行设置,那么你将删除所有大于你. w& F' j8 X* p- ?8 A# b3 x
设置有数的冗余组
8 U, D3 z6 S. p$ X# G DELETE* b' Y, W0 X- a! x0 b5 e
FROM Customers( K! p$ ]% E' O! G9 t1 U2 z5 d% u
WHERE ID IN
% }) M9 t* M, N \, }" p/ ?( {* ^ (SELECT ID$ E( p/ Y8 B$ Q
FROM1 @" ?' U# I+ o6 D0 Y0 n& L
(SELECT ID, LastName, FirstName, RANK() OVER (PARTITION BY LastName,
" `8 I7 }% a" }7 U ^ FirstName ORDER BY ID) AS SeqNumber
. A: a0 u( y# @6 @) l P FROM, L, R6 Y7 j6 r0 g9 R X! M
(SELECT ID, LastName, FirstName; a: m8 H, N0 t* j* v
FROM Customers0 Q3 S# E9 o. R
WHERE (LastName, FirstName) IN (SELECT LastName, FirstName
6 X# Y" u1 | L& ^& W; U7 _ FROM Customers
+ z8 m4 a9 P( ?/ Q$ H# _* ]% e GROUP BY LastName, FirstName" c F ^6 p7 O% U1 ^$ n6 k
HAVING COUNT(*) > 3)))
: g$ ^' g* t5 B% Q( k WHERE SeqNumber > 3);
5 V/ r d0 }/ j) w8 n As you can see, using the RANK() function allows you to eliminate duplicates in a# t" Y, x0 W4 Z$ s$ E
single SQL statement and gives you more capabilities by extending the power of
& V# }7 x2 J9 X. U- q3 `* q/ c your
3 I, \- @$ T; g" a* n queries.0 {1 m( _9 }3 h" x
正如你所见使用Rank()可以消除冗余数据而且能给你很大的可伸展性 |