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