将 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:

如果 @keywordLike 包含 %Alice%iPhone,我们会 return:

如果 @keywordLike 包含 Screen 我们会 return:

这个查询是否符合您的要求?

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);