cust表
| custid (pk) | 证件号码| 客户资料1|客户资料2|客户资料3现在的要求是把证件号码相同的记录,进行合并,最新的客户资料1,2,3不为空就选择最新的客户资料,为空,就选择离它最近不为空的记录更新,同时还有些以custid为外键的表,合并后custid要进行更新
请问这个算法要怎么样才能高效率呢?   
多谢大家

解决方案 »

  1.   

    基本思路:先合并cust表证件号码重复的记录
    再更新外键表数据custid为最终保留的custid 
    最后删除cust表非保留记录
      

  2.   


    -----------------------------------------------------
       基本思路:先合并cust表证件号码重复的记录
    再更新外键表数据custid为最终保留的custid 
    最后删除cust表非保留记录
    ---------------------------------------------------合并cust证件号码重复的算法过程是什么呢?  
     
      

  3.   

    搞不懂。假如:
    1、 客户资料1|客户资料2|null
    2、 客户资料1|客户资料2|null
    3、 客户资料1|客户资料2|null
    这3条记录怎么合并呢?是合并成2条,还是不合并?合并了那些关联资料又怎么办呢?
      

  4.   

    ------------------------------------------------------
    搞不懂。假如:
    1、 客户资料1|客户资料2|null
    2、 客户资料1|客户资料2|null
    3、 客户资料1|客户资料2|null
    这3条记录怎么合并呢?是合并成2条,还是不合并?合并了那些关联资料又怎么办呢?
    -----------------------------------------------------------如果这3条记录的证件号码相同,更新的时候,取max(custid)的记录更新
    也就是 custid=3 客户资料1|客户资料2|null,其他与custid=1,custid=2关联的记录,更新custid=3,同时删除
    1、 客户资料1|客户资料2|null
    2、 客户资料1|客户资料2|null
      

  5.   

    按我的理解,假如:
    1、证件号码1  客户资料1|客户资料2|客户资料3
    2、证件号码1  null     |客户资料2|null
    3、证件号码1  客户资料1| null    |null应该取 第3条的客户资料1 和 第2条的客户资料2 和 第1条的客户资料3 作为该证件号码最后应该保留的记录.这个情况有时的确会出现.用存储过程一步步去写肯定可以,用一条语句似乎不太可能.
    楼主的意思也应该是明白的,只是想求个高效的方法.这就不好说了.
      
      

  6.   

    cust
    custid(pk) 证件号码info
    infoid(pk) custid(fk) 客户资料
      

  7.   

    抱歉,我只看到  kongxiangli(笑看红尘) 说的内容. 因为一次打开很多帖子,挨个看了回复,才看到这个帖子.刚才楼主说的需求和我的意思差不多吧.以我的水平,无法给出更高效的方法了. 你想想,这个表原来的设计倒没问题,关键是对这个表的利用方法(不是更新相同身份证号的记录,反倒是又添加相同身份证号的改过的记录)实在非常糟糕,看了让人都义愤填膺,很白痴. 面对这样糟糕的结果,你想要来个高效的方法? 太渺茫.
      

  8.   

    theforever(碧海情天)
    对,需求和你说的是一样的~~
    目前的情况是,这个表里已经有这样的数据了,而且很多,即使我这次合并了,后面还会不断增加类似的记录,所以希望大家一起探讨出一个效率高的算法,做个线程,定时执行
      

  9.   

    theforever(碧海情天) :
    你说话也太偏激了。
    这不一定是设计的问题啊,给你说个场景:比如以前是分布式数据库,现在集中了,自然就出现了楼主说的这种情况。这个题目其实非常有意思,可以考验大家数据库基本功。
    大家都开动脑筋,帮楼主想下吧。
      

  10.   

    分布式数据库是理由吗????那custid(pk) 由什么规律决定?
      

  11.   

    theforever(碧海情天) :
    你可能没做过类似的系统,给你举我以前做的例子吧。
    数据库开始是每个点一个,后来数据集中到一个地方,我就给每个地方的custid前面加一个头,比如第一个点的custid变成 01XXXXX,第二个点变成02XXXXX。
    合并之后就有重复的数据了!
      

  12.   

    我做过一个应用从需求上也是不得不定时(晚上)向各分站采集更新数据并同步数据库,然后在业务时间内都使用各分站本地同步后的数据库. 因为数据量大,无法全部实时操作.这种情况就类似 hbwhwang(catmiw的ID已经停用,现在用这个) 所说的情况了.但我提的方案不是把各分站的数据不管重不重复都归拢到一起.一没效率,二占资源.我的方法是在分站同步后的数据库中取数据完成业务,把业务结果存到一个"提交表"中.与中心数据库同步时,只需要把"提交表"中的记录更新到中心数据库对应的记录即可.待所有分站完成向中心的提交后,再把中心的最新最全的数据同步到各分站.试想一下,如果简单地把各分站的数据全都抓取过来,再进行筛选,对效率和资源的浪费简直不可想像.
      

  13.   

    hbwhwang(catmiw的ID已经停用,现在用这个) 
    theforever(碧海情天)
    谢谢2位热情讨论 
    发现的问题的确是这样:
      “如果简单地把各分站的数据全都抓取过来,再进行筛选,对效率和资源的浪费简直不可想像”
    所以,我们以后从业务上重新做了要求,各分站首先要自己合并,再与中央数据库同步,不会再把所有的数据都收集进这个表里面来了