Настройка запроса соответствия текста SQL - PullRequest
1 голос
/ 28 октября 2011

Я пытаюсь выполнить произвольное сопоставление с произвольным текстовым поиском и задаюсь вопросом, могу ли я улучшить этот запрос (используя MSSQL 2008):

@ FreeText - это таблица, в которой каждая строка представляет собой поисковое слово

DECLARE @WordCount = (SELECT COUNT(*) from @FreeText)

SELECT p.ID
FROM Product p

OUTER APPLY
(
    SELECT COUNT(ID) as MatchCount
    FROM Product pm
    INNER JOIN @FreeText ft
    ON pm.txt like '%'+ft.text+'%'
    WHERE pm.ID = p.ID
    AND (SELECT TOP 1 [text] FROM @FreeText) IS NOT NULL
)MC

WHERE MatchCount = @WordCount

Поэтому мне интересно, есть ли способ избежать "FROM Product pm" во внешнем применении?

Я не могу всегда INNER JOIN @FreeText, потому что иногда мы не используем freeпоиск текста.

Буду очень признателен за любые мысли или советы, также дайте мне знать, если я смогу что-то уточнить.Заранее спасибо.

PS Я знаю, что в MS SQL есть поиск FREETEXT (), но я, к сожалению, пока не могу его использовать.

1 Ответ

1 голос
/ 28 октября 2011

Вот запрос без OUTER APPLY, который возвращает все результаты, когда отсутствуют критерии поиска.

DECLARE @FreeText TABLE
(
  [text] varchar(200)
)
INSERT INTO @FreeText SELECT 'a'
INSERT INTO @FreeText SELECT 'c'

-- what, null?  No.
DELETE FROM @FreeText WHERE [text] is null

DECLARE @WordCount int
SET @WordCount = (SELECT Count(*) FROM @FreeText)

SELECT p.ID
FROM Product p
LEFT JOIN @FreeText ft
ON p.txt like '%' + ft.text + '%'
WHERE ft.text is not null OR @WordCount = 0
GROUP BY p.ID
HAVING COUNT(*) = @WordCount OR @WordCount = 0

Примечание: я бы предпочел не использовать запрос "freetext", когда его неткритерии свободного текста - вместо этого используйте другой запрос (проще).Если вы решили пойти по этому пути - вернитесь к INNER JOIN и сбросьте OR @WordCount = 0 x2.

...