本帖最后由 intrdpid 于 2009-08-07 11:17:24 编辑

解决方案 »

  1.   

    如果 表A的 字段:标准地址 上面,建立有索引的话。 我就写的存储过程干这件事情了。参数 inStr
    SELECT * FROM A WHERE 标准地址 like inStr || '%';
    如果有数据,就返回
    如果没有数据  把 inStr 砍掉最后一个字符,继续查询, 直到 查询到,或者砍完了也没有。
    如果 表A的 字段:标准地址 上面,没有索引的话……  当我没说,哈哈~
      

  2.   

    SQL
    直接不行吗SELECT A.* FROM A JOIN B ON CHARINDEX(B.新增地址,A.标准地址)>0
      

  3.   

    先多谢SQL77的意见,我的意思是可否在C#的数组里解决,因为数组的执行效率比起sql执行效率要高。
      

  4.   

    其实用SQL是最好的。
    数组的话你要循环多少遍啊,如果你不能修改SQL语句的话,可以先赋值到两个datatable中,然后循环一个datatable然后select另一个datatable的记录,如果存在则不添加到要输出的datatable中,如果不存在则添加到新的datatable中,最后把另一个datatable的数据全部加到输出的datatable中就OK了,不过执行效率会很低。
      

  5.   

    谢谢大家的支持,如果用sql处理的话,换句话说,就是要先将B的每条记录拆分为table的形式,再逐一将A的每条记录也拆分为table的形式,然后select count(*) from A INNER JOIN B,取最大的count值,原理非常简单,但如果要循环1000000×3000次,这非得等几天不可,大家有没有更好的办法呢?例如,怎样才可以在B字段中挑选几个字作为select * from A 的条件。再具体一点:B的记录为“广州芳村区白云大道10号3楼”,怎样才能匹配到A表的“广东省广州市芳村区白云大道10号3座”呢?好像有点人工智能的味道,因为B的记录为人工采集,千差万别的,地址中的“栋,幢,楼”用人工一下就可以知道是同一样东西,但SQL查询不能识别。
      

  6.   

    B表 广州芳村区白云大道10号3楼
    A表 广东省广州市芳村区白云大道10号3座(假定字段为A)
    你可以首先定义一个表,
    栋,幢,楼表示一样的东西,对市的区分,之类的,
    按照市、街道、大道、号、楼进行分解
    那么解析之后的Sql应该是
    A.A like '%广州%' and A.A like '%芳村区%'
    and A.A like '%白云大道%' and A.A like '%10号%'总之,首先你得把拆分的依据定义出来,那些字眼是一样的意思定义出来,这样在分析数据
    组装Sql依据,比价复杂,效率也不是太高
      

  7.   

    感谢mbh0210(独孤求败),你说出了实现的其中一种方法,但我最头疼的是如何在标准B表的100万条记录选出相近的记录,因为有些地址是很不规范的,例如白云大道***号,人工一看就知道是那个区,但电脑分别不出来。有什么好办法吗?我知道这比较复杂,有点人工智能的味道。