У меня есть таблица, содержащая мои объявления, которые можно искать в 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