我不确定该如何优化。我需要从一个表中进行选择,将关键字搜索应用于各个表中的多个列:
SELECT mt.Id
FROM tbl_MyTable mt
JOIN tbl_AnotherTable at
ON mt.ForeignKey = at.Id
WHERE <some stuff>
AND (
mt.Id IN (
SELECT mt2.Id
FROM tbl_MyTable mt2
JOIN @keywordLike kl
ON mt2.Name LIKE kl.Keyword
WHERE <same stuff as before, but for mt2>
) OR
at.Id IN (
SELECT at2.Id
FROM tbl_AnotherTable at2
JOIN @keywordLike kl
ON at2.Name LIKE kl.Keyword
OR at2.Widget LIKE kl.Keyword
) -- in reality, the "keyword" search is applied to three other tables
)
@keywordLike
是一个表变量,其中包含要与多个表中的多个列进行匹配的字符串。
请注意,只要任何内容与关键字搜索匹配,而不是与 all 匹配,Id
中的tbl_MyTable
就会返回,这就是为什么我不只是做一堆JOIN
。这些表非常大,我跳过的<some stuff>
部分已经过滤掉了很多。看来我真正想要的是能够JOIN...ON...
,但它们之间有一个OR
,但这是到目前为止我想到的最好的选择。
以下是一些示例数据:
[[MyTable]]
Id Name ForeignKey
1 Alice 1
2 Bob 2
[[AnotherTable]]
Id Name Widget
1 iPhone Screen
2 Android Screen
如果@keywordLike
仅包含以下字符串:%A%
,我们将返回:
1
(因为%A%
与Alice
相匹配)2
(因为%A%
匹配Android
,而Bob的ForeignKey
匹配ID 如果@keywordLike
包含%Alice%
,iPhone
,我们将返回:
1
(因为%Alice%
与Alice
相匹配)1
(因为%iPhone%
匹配iPhone
,而Alice的ForeignKey
匹配ID 如果@keywordLike
包含Screen
,我们将返回:
1
2
答案 0 :(得分:3)
此查询是否可以满足您的要求?
SELECT mt.Id
FROM tbl_MyTable mt JOIN
tbl_AnotherTable at
ON mt.ForeignKey = at.Id
WHERE mt.name LIKE @keywordlike OR
at.name LIKE @keywordlike OR
at.widget LIKE @keywordlike;
如果是这样,要在SQL Server中提高效率将是一个挑战。一种可能是全文搜索,但即使在整个表中也可能很难。
编辑:
如果@keywordlike
是表变量:
SELECT mt.Id
FROM tbl_MyTable mt JOIN
tbl_AnotherTable at
ON mt.ForeignKey = at.Id
WHERE EXISTS (SELECT 1 FROM @keywordlike kl WHERE mt.name LIKE kl.keyword) OR
EXISTS (SELECT 1 FROM @keywordlike kl WHERE at.name LIKE kl.keyword) OR
EXISTS (SELECT 1 FROM @keywordlike kl WHERE at.widget LIKE kl.keyword);