| allen's profileCui's SpacePhotosBlogLists | Help |
|
2/3/2009 从利用Sql2005 CTE(Common Table Expression)进行数据去重学到的昨天在解决一个数据去重的问题时,偶然从Google看到了这篇文章:Removing Duplicate Records using SQL Server 2005 (作者:Tim Chapman)。基本方法是利用Dense_Rank()结合OVER加Order By NewID() 对CTE数据中的重复记录排序,利用Rank返回值(>1)去重。 学到了以下知识点,与大家分享下(中文中关于CTE的知识确实也少的可怜): 1。CTE数据与Source Table数据的关系。 从MSDN给的定义上看,似乎CTE数据只是源数据在某种限制条件下的拷贝,看不出操作CTE数据会对源数据有什么影响。这一点,从红色文字似乎可以有这个结论。试想,temporary result set怎么可能翻过头去影响源数据呢?
但上文中作者用到的去重技巧,偏偏就是通过删除CTE数据达到源数据去重的目的的。 而且,我自己做了试验,分别对CTE中的数据进行了Update和Delete,发现源数据的对应记录,也确实被更新了。 所以,CTE中的数据,实际上和源表中的数据,是保持一致同步更新的。这一点,鉴于提到的人不多,有必要强调一下,免得后来者confuse。 2。关于重复数据的判断 作者的方法委实非常巧妙(Y):利用DENSE_RANK(MSDN)结合Over(MSDN)加上ORDER BY(这个就不用链接了吧) NEWID() ,注意,这个NewID()是关键。对于OVER ( [ PARTITION BY value_expression <ORDER BY_Clause>)这句而言,PARTITION BY可以理解为Group By,正是因为NewID()的出现,才使得同一个Partition中的相同数据,有了不同的Rank值。 于是,所有不重复的记录,Rank都等于1,而重复的,除了那条要保留的等于1的外,都大于1。 再然后就简单了,直接将>1的,干掉即可。 P.S. 所谓重复与否,取决与Partition By后面的value_expression。注意别填少了就成,毕竟,数据删除,还是要慎之又慎!! 以上只是CTE的一些个人所悟,未尽或不对之处,还请看到的DX指正。相信,这只是CTE活学活用的冰山一角而已,未提到的recursive特性,相信也是值得认真学习和揣摩的。这里还提到了一些,不妨参考下。学无止境,学海无涯。 |
|
|