将 JOIN 与 OR 组合
Combining JOINs with OR
我不确定如何优化它。我需要 select 来自 table,将关键字搜索应用于各种 table 中的多个列:
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
是一个 table 变量,其中包含尝试匹配多个 table 中的多个列的字符串。
请注意,tbl_MyTable
中的 Id
将在任何时候被 return 编辑 任何东西 匹配关键字搜索,而不是 all,这就是为什么我不只是做一堆 JOIN
的原因。这些 table 非常大,我跳过的 <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%
,我们会 return:
1
(因为 %A%
匹配 Alice
)
2
(因为%A%
匹配Android
,而Bob的ForeignKey
匹配那个Id
如果 @keywordLike
包含 %Alice%
、iPhone
,我们会 return:
1
(因为 %Alice%
匹配 Alice
)
1
(因为 %iPhone%
匹配 iPhone
而 Alice 的 ForeignKey
匹配那个 Id
如果 @keywordLike
包含 Screen
我们会 return:
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 服务器的效率。一种可能性是全文搜索,但即使在 table 秒内也可能很棘手。
编辑:
如果 @keywordlike
是一个 table 变量:
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);
我不确定如何优化它。我需要 select 来自 table,将关键字搜索应用于各种 table 中的多个列:
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
是一个 table 变量,其中包含尝试匹配多个 table 中的多个列的字符串。
请注意,tbl_MyTable
中的 Id
将在任何时候被 return 编辑 任何东西 匹配关键字搜索,而不是 all,这就是为什么我不只是做一堆 JOIN
的原因。这些 table 非常大,我跳过的 <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%
,我们会 return:
1
(因为%A%
匹配Alice
)2
(因为%A%
匹配Android
,而Bob的ForeignKey
匹配那个Id
如果 @keywordLike
包含 %Alice%
、iPhone
,我们会 return:
1
(因为%Alice%
匹配Alice
)1
(因为%iPhone%
匹配iPhone
而 Alice 的ForeignKey
匹配那个 Id
如果 @keywordLike
包含 Screen
我们会 return:
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 服务器的效率。一种可能性是全文搜索,但即使在 table 秒内也可能很棘手。
编辑:
如果 @keywordlike
是一个 table 变量:
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);