【问题标题】:Paging and custom-ordering a result分页和自定义排序结果
【发布时间】:2010-02-23 13:47:45
【问题描述】:

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

1) “条目” 2)“条目#” 3)“输入东西” 4)“..入口..”

我是通过 Union All 和 4 个不同的查询完成的。

但另外,我想包括分页,以便我可以 f.ex。接收行号 1-100、101-200 等。我尝试了 Row_Num() Over (Order By) 但没有完成,我认为是因为 Order By-clause 破坏了我的 自己的订单。

我的查询看起来像这样(有点简化)

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)

【问题讨论】:

  • 你能发布你的整个查询吗?

标签: sql union row-number


【解决方案1】:

将您的联合查询作为派生表包装在另一个中,您可以使用 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 - 如果您选择 * where 关键字如 k%,您可能会得到一次 k1、k2、k3、k4、k5,下一次是 k5、k4、k3、k2、k1 (SQL 不保证返回顺序,它可能会有所不同)。这会让你的分页失效。

【讨论】:

  • 对不起,我的问题不是很准确。我希望能够获取中间的任何行,而不仅仅是前 100 行,用于分页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2011-09-09
  • 2021-05-17
  • 1970-01-01
相关资源
最近更新 更多