各位大师,现在有一张 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写法 ,谢谢指教!
现在还有一张B表 ,表中有一个字段 str2 里面存储着字符 用 ,隔开 ,如 C,A
现在要求 如果 str2中的 字符都能在str中找到,则选出该条记录
即 如果一条记录 的str2 字段是 D,B 的话,str 为 A;C;B;D 则选出该条记录
如果 如果一条记录 的str2 字段是 D,E 的话,str 为 A;C;B;D ,则不选出该条记录
,请问有什么高效的SQL写法 ,谢谢指教!
建一个新表对应你的这个逻辑其实也是个不错的选择
新表C中存放 B表可能出现的字段 str2 和 包含它的A表的字段str
比如 "D,B" "A,D,B"
"D,B" "A,B,D"
"D,B" "D,B,A"
等等
然后用exists来查关联就好
最后用索引优化下,ok了
好像不行,str2的值可能是“D,B”,也可能是“B,D”
建议:
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 也可又用存储过程加游标实际
略