我有一个类似于以下内容的查询,用于返回与全文搜索匹配的文章。在生产中,文本[FULL TEXT SEARCH CRITERIA]
被替换为实际的全文搜索表达式。
编写的查询仅返回一页结果。
WITH ArtTemp AS (
SELECT TOP (@StartRow + @MaxRows) ROW_NUMBER() OVER (ORDER BY ArtViews DESC) AS RowID,
Article.ArtID,Article.ArtTitle,Article.ArtSlug,Category.CatID,Category.CatTitle,
Article.ArtDescription,Article.ArtCreated,Article.ArtUpdated,Article.ArtUserID,
[User].UsrDisplayName AS UserName FROM Article
INNER JOIN Subcategory ON Article.ArtSubcategoryID = Subcategory.SubID
INNER JOIN Category ON Subcategory.SubCatID = Category.CatID
INNER JOIN [User] ON Article.ArtUserID = [User].UsrID
WHERE [FULL TEXT SEARCH CRITERIA] AND Article.ArtApproved = 1
)
SELECT ArtID,ArtTitle,ArtSlug,CatID,CatTitle,ArtDescription,ArtCreated,ArtUpdated,
ArtUserID,UserName FROM ArtTemp
WHERE RowID BETWEEN @StartRow + 1 AND (@StartRow + @MaxRows)
ORDER BY RowID
这工作正常,只是全文搜索按相关顺序返回结果,但 ROW_NUMBER() OVER (ORDER BY ArtViews DESC)
对结果进行排序。有没有办法在不使用结果的情况下编写相同的查询?
最佳答案
看起来正确的答案是使用 CONTAINSTABLE
,它的工作方式与 CONTAINS
类似,但返回一个表而不是 bool 值 WHERE
> 条件。
所以我最终得到了这样的结果。
WITH ArtTemp AS (
SELECT TOP (@StartRow + @MaxRows) ROW_NUMBER() OVER (ORDER BY FTS.RANK DESC) AS RowID,
Article.ArtID,Article.ArtTitle,Article.ArtSlug,Category.CatID,Category.CatTitle,
Article.ArtDescription,Article.ArtCreated,Article.ArtUpdated,Article.ArtUserID,
[User].UsrDisplayName AS UserName FROM Article
INNER JOIN Subcategory ON Article.ArtSubcategoryID = Subcategory.SubID
INNER JOIN Category ON Subcategory.SubCatID = Category.CatID
INNER JOIN [User] ON Article.ArtUserID = [User].UsrID
INNER JOIN CONTAINSTABLE(Article, *, 'FORMSOF(INFLECTIONAL, abc)') AS FTS ON Article.ArtID = FTS.[KEY]
WHERE Article.ArtApproved = 1
)
SELECT ArtID,ArtTitle,ArtSlug,CatID,CatTitle,ArtDescription,ArtCreated,ArtUpdated,
ArtUserID,UserName FROM ArtTemp
WHERE RowID BETWEEN @StartRow + 1 AND (@StartRow + @MaxRows)
ORDER BY RowID
关于sql-server - 无需重新排序即可返回全文搜索结果页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6314502/