Как я могу использовать содержащуюся таблицу с ограничением на данные в таблице, которую она ищет? - PullRequest
2 голосов
/ 22 февраля 2010

У меня есть таблица, содержащая мои объявления, которые можно искать в sql-server-2008. Смотрите следующий фрагмент кода. Параметр is_searchable в таблице ad_search, по сути, является признаком того, следует ли включать это объявление в поиск.

Три примера ниже приводят к необоснованным выводам:

В первом примере возвращается 1000 записей. все с is_searchable установленным в 0. Эти строки бесполезны для меня в этом случае использования.

Во втором примере показан результат применения предложения where для фильтрации записей is_searchable, которые не соответствуют действительности. Поскольку ни один из них не был возвращен в содержащейся в нем части запроса, ни один не был возвращен при применении предложения where.

В третьем примере только top_n_by_rank был изменен с 1000 на 4000.

Итак, мой вопрос: как я могу получить ТОП 1000 или n результатов с моим предложением "is_searchable = 1"?

use live;

declare @search_text as varchar(2000) = '"*interlet*"'


--- TOP 1000 without clause (returns 1000 rows (all with is_searchable = 0)
select is_searchable, *
from CONTAINSTABLE (ad_search, searchText, @search_text, 1000) AS KEY_TBL
inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id


--- TOP 1000 with "where ad_search.is_searchable = 1" clause returns 0 rows
select is_searchable, *
from CONTAINSTABLE (ad_search, searchText, @search_text, 1000) AS KEY_TBL
inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id
where ad_search.is_searchable = 1

-- TOP 4000 
select is_searchable, *
from CONTAINSTABLE (ad_search, searchText, @search_text, 4000) AS KEY_TBL
inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id
where ad_search.is_searchable = 1 

1 Ответ

3 голосов
/ 22 февраля 2010

Попробуйте это:

DECLARE @N int
SET @N=325

SELECT TOP(@N)
    is_searchable, *
    from CONTAINSTABLE (ad_search, searchText, @search_text) AS KEY_TBL
    inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
    inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id
    where ad_search.is_searchable = 1
    ORDER BY KEY_TBL.Rank DESC

@ N может быть 1000 или что вы хотите, чтобы оно было

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...