我想查询一个表,以便按以下方式排序:
1)“进入” 2)“进入#” 3)“进入的东西” 4)“..entry ..”
我是通过Union All和4个不同的查询来完成的。
但另外,我想包括分页,以便我可以f.ex.收到行号1-100,101-200等我试过Row_Num()Over(Order By)但是没有完成它,我认为因为Order By子句摧毁了我的 自己的订单。
我的查询看起来像这样(有点简化)
SELECT Keyword FROM Keyword WHERE Keyword LIKE 'Keyword' Union All SELECT * FROM Keyword WHERE Keyword like '%Keyword%' AND NOT LIKE 'Keyword'
我尝试了整个查询:
WITH SearchResult as
(SELECT * FROM Keyword WHERE Keyword like 'Keyword' Union All SELECT * FROM Keyword WHERE Keyword like '%Keyword%' AND NOT LIKE 'Keyword')
SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY Keyword DESC) AS RowNum, *
FROM SearchResult) AS Results
WHERE (RowNum BETWEEN (1 - 1) * 100 + 1 AND 1 * 100)
答案 0 :(得分:0)
将联合查询作为派生表包装在另一个中,您可以使用top子句。
SELECT TOP 100 * FROM (
SELECT * FROM table where field = 'entry'
UNION ALL
SELECT * FROM table where field = 'entry#'
) sortedresults
然后你走在正确的轨道上。将已定义的列添加到已排序结果的每个子集中,然后您可以使用它来保持排序顺序。
WITH SearchResult AS
(SELECT *, ROW_NUMBER() OVER (ORDER BY QueryNum) as RowNum FROM
(SELECT *, 1 as QueryNum FROM KeywordTable WHERE field = 'Keyword'
UNION ALL
SELECT *, 2 from KeywordTable WHERE field = 'Keyword#'
) SortedResults
)
SELECT * from SearchResults WHERE RowNum BETWEEN 4 and 10
重要的是,您还要通过关键字之外的其他内容对每个子查询进行排序,以使它们的顺序在运行之间保持相同(并作为行号函数的辅助排序)。例如:假设您有k1,k2,k3,k4,k5 - 如果您选择*其中k%这样的关键字,您可能会获得k1,k2,k3,k4,k5一次以及k5,k4,k3,k2,k1下一个(SQL不保证退货订单,它可以有所不同)。这会抛弃你的传呼。