繁体   English   中英

将JOIN与OR组合

[英]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_MyTableId ,而不是全部 ,这就是为什么我不只是在做一堆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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM