我有两个表:A和B,每个表都包含字符串。当表 A 的字符串包含表 B 的字符串时,我需要找到表 A 和表 B 之间的所有匹配项(B.stringColumn 是 A.stringColumn 的子字符串)。
我使用以下代码使用CHARINDEX()
函数做到了这一点:
SELECT *
FROM A, B
WHERE CHARINDEX(B.stringColumn, A.stringColumn) > 0
有没有更有效的方法?
这个表可能包含大量数据,这就是我问这个问题的原因。
提前感谢,努里尔
我更倾向于将其表述为:
SELECT *
FROM A JOIN
B
ON A.stringColumn LIKE '%' + B.stringColumn + '%';
唉,这根本无助于性能。 问题是在字符串中间查找模式不能使用优化或任何其他技术。 您坚持使用嵌套循环联接算法。
在某些情况下,您可能能够使用全文索引。 在两个表之间连接时,这可能有点挑战性。
这个问题有一个技术解决方案。 它涉及基于称为 n 元语法(例如 3 个字符组合)的索引。 但是,SQL Server 不支持此索引类型。
嗯,你可以使用 LIKE 运算符。这可能不会给你一些重要的性能升级,但它有机会使用索引(如果该列上有索引),而对于 where 子句中的函数,索引将永远不会被使用。