0

我有两个表:A 和 B,每个表都包含字符串。当表A的字符串包含表B的字符串(B.stringColumn是A.stringColumn的子字符串)时,我需要找到表A和表B之间的所有匹配项。

我使用CHARINDEX()函数通过以下代码完成了它:

SELECT *
FROM A, B
WHERE CHARINDEX(B.stringColumn, A.stringColumn) > 0 

有没有更有效的方法来做到这一点?

该表可能包含大量数据,这就是我问这个问题的原因。

在此先感谢,努里尔

4

2 回答 2

2

我更倾向于将其表述为:

SELECT *
FROM A JOIN
     B
     ON A.stringColumn LIKE '%' + B.stringColumn + '%';

唉,这根本对性能没有帮助。问题是在字符串中间寻找模式不能利用优化或任何其他技术。你被嵌套循环连接算法困住了。

在某些情况下,您也许可以使用全文索引。在两个表之间连接时,这可能有点挑战。

这个问题有一个技术解决方案。它涉及建立在称为 n-gram(例如 3 个字符组合)的索引上。但是,SQL Server 不支持这种索引类型。

于 2017-02-01T11:58:12.103 回答
0

嗯,你可以使用 LIKE 运算符。这可能不会给您带来一些显着的性能提升,但它有机会使用索引(如果该列上有索引),而 where 子句中的函数将永远不会使用索引。

于 2017-02-01T12:05:09.513 回答