Объединение СОЕДИНЕНИЙ с ИЛИ - PullRequest
0 голосов
/ 27 сентября 2018

Я не уверен, как я могу оптимизировать это.Мне нужно выбрать из таблицы, применив поиск по ключевым словам к нескольким столбцам в различных таблицах:

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 - это табличная переменная, содержащая строки, которые пытаются сопоставить несколько столбцов в нескольких таблицах.

Обратите внимание, что Id из tbl_MyTable будет возвращено в любое время что угодно соответствует поиску по ключевому слову, а не all , поэтому я не просто делаюкуча 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, а ForeignKey Боба соответствует этому идентификатору

Если @keywordLike содержит %Alice%, iPhone, мыd return:

  • 1 (потому что %Alice% соответствует Alice)
  • 1 (потому что %iPhone% соответствует iPhone и Алиса ForeignKey соответствует этомуId

Если @keywordLike содержит Screen, мы вернемся:

  • 1
  • 2

1 Ответ

0 голосов
/ 27 сентября 2018

Делает ли этот запрос то, что вам нужно?

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 будет непросто.Одной из возможностей является полнотекстовый поиск, но даже t, который может быть сложным для разных таблиц.

РЕДАКТИРОВАТЬ:

Если @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); 
...