我有表 A:
---CODE-----
|21XDS60020| <-There is somewhere in table B
|21XDS60021|
|21XDS60023| <-There is somewhere in table B
|21XDS60025|
|21XDS60026|
和表 B:
----------------DESCRIPTION--------------------------
|FAX21XDS60020[2008_504571][NMS]sdfg bla bla |
|FAX21XDS52167[2008_XXX324][NMS]sdfg bla blb |
|FAX21P025P61[2006_501909][21XDS60023]sdfg bla blc |
|FAX21XDS60025[2006_502499][NMS]sdfg bla bld |
|FAX21P0251296[2007_503659][NMS]sdfg bla ble |
预期成果:
---------------------DESCRIPTION--------------------
|FAX21XDS60020[2008_504571][NMS]sdfg bla bla |
|FAX21P025P61[2006_501909][21XDS60023]sdfg bla blc |
我想从表 B 中选择所有"描述"记录,如果它们包含表 A 的"代码"记录之一作为子字符串我不知道在这种情况下我是否可以以某种方式使用 IN 或 EXISTS 和正则表达式语句。
类似的东西(当然以下内容是错误的(:
SELECT description FROM B WHERE description IN (select REGEXP(.*code.*) FROM A);
这是一个
JOIN 操作,具有令人讨厌的不可优化的缓慢ON
条件。
SELECT B.description
FROM A
JOIN B ON B.description LIKE CONCAT('%', A.code, '%')
它很慢,因为'needle' LIKE '%haystack%'
这意味着MySQL必须查看大海捞针中的所有内容。
另一方面,'needle' LIKE 'haystack%'
(没有前导%
(可以使用索引。因此,如果这适用于您的数据,您应该使用它。
SELECT B.description
FROM A
JOIN B ON B.description LIKE CONCAT('FAX', A.code, '%')
可能是这样的相关EXISTS
:
SELECT description FROM B
WHERE exists (
select 1 FROM A
where B.description like concat('%',A.code,'%')
);