A表
def          gi          
A           11;22;33
B           44;55;66
C           66;22B表
gi_new
22
55
想要通过gi_new月gi字段关联(只要gi_new字段的内容在gi字段中出现即可关联上,如:22包含于11;22;33),得到def结果应该为:
A_B表
gi             gi_new            def
11;22;33         22                A
44;55;66         22                B
66;22            22                C
44;55;66         55                B我本来想通过模糊连接,貌似语法不支持呀。
如:create table A_B select A.*,B.* from A,B where B.gi_new like '%gi%';想法太天真。。
注:其中A表的记录上千万条
请问如何能够有效得到相应结果。

解决方案 »

  1.   

    select * from a left join b on instr(def,gi_new)>0
    对字符操作速度不会快
      

  2.   

    select *
    from A,B
    where charindex(B.gi_new,A.gi)>0
      

  3.   

    select *
    from a,b
    where FIND_IN_SET(gi_new,replace(a.gi,';',','));
      

  4.   

    不过无论什么方法(比如另外还可以用 like, regexp 等),基于你目前的表结构,如果B表中记录也很多的话则效率都不会太高。 因为A表的设计连基本的数据库设计的第一范式都不满足
      

  5.   

    如果不改表结构以符合基本的范式,则没什么好的思路。从理论上,你A表 1000万记录, B表 1000记录的话, 则不管什么方法,针对A表中每第记录,你都需要与B表中的每一个记录进行 LIKE、REGEXP、FIND——IN——SET的计算和判断。 没有索引可以利用。所以这种设计本身就决定了必须运算  1000万记录*1000记录 次。