分页和自定义结果

时间:2010-02-23 13:47:46

标签: sql union row-number

我想查询一个表,以便按以下方式排序:

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)

1 个答案:

答案 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不保证退货订单,它可以有所不同)。这会抛弃你的传呼。