[英]Combining JOINs with OR
我不确定如何优化这个。 我需要从表中选择,将关键字搜索应用于各种表中的多个列:
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
是一个表变量,包含要尝试与多个表中的多个列匹配的字符串。
请注意, 任何与关键字搜索匹配的内容都会返回来自tbl_MyTable
的Id
,而不是全部 ,这就是为什么我不只是在做一堆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
这个查询是否符合您的要求?
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.