各位大师,现在有一张 A 表 ,表中有一个字段  str 里面存储着 字符并用;隔开 ,如 A;C;B;D
现在还有一张B表 ,表中有一个字段 str2 里面存储着字符 用 ,隔开 ,如 C,A
现在要求 如果 str2中的 字符都能在str中找到,则选出该条记录
即 如果一条记录 的str2 字段是 D,B 的话,str 为 A;C;B;D 则选出该条记录
如果 如果一条记录 的str2 字段是 D,E 的话,str 为 A;C;B;D ,则不选出该条记录
,请问有什么高效的SQL写法 ,谢谢指教!

解决方案 »

  1.   

    如果A表中str里对应的记录不多,比如只有 abcde 或者 只有abcd的话
    建一个新表对应你的这个逻辑其实也是个不错的选择
    新表C中存放 B表可能出现的字段 str2 和 包含它的A表的字段str
    比如 "D,B"  "A,D,B"
    "D,B"  "A,B,D"
    "D,B"  "D,B,A"
    等等
    然后用exists来查关联就好
    最后用索引优化下,ok了
      

  2.   

    select * from b where str2 in (select replace(str,";",",") from a)
      

  3.   


    好像不行,str2的值可能是“D,B”,也可能是“B,D”
      

  4.   

    用一条SQL解决之个问题,不会有很好的效率。
    建议:
    1、加工一张B表的中间表;
    2、B表中的STR2值,用多条记录存储。
       如:
       B表中原来的数据是:
       USERID STR2
       张三    D,B...
       
       加工到B表中间表:
       USERID STR2
       张三    D
       张三    B
       ...   
    3.加工B表中间表的方法
    (3.2)可以用INSERT ALL
    INSERT ALL
    WHEN INSTR(B,',',1,1)>0 THEN INSERT INTO b中间表 values(a,substr(B,1,INSTR(B,',',1,1) )
    WHEN INSTR(B,',',1,2)>0 THEN INSERT INTO b中间表 values(a,substr(B,INSTR(B,',',1,1) +1,INSTR(B,',',1,2) )
    ...
    selec * from B
    3.2 也可又用存储过程加游标实际
     略