0

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

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)
4

1 回答 1

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 - 如果您选择 * where 关键字如 k%,您可能会得到一次 k1、k2、k3、k4、k5,下一次是 k5、k4、k3、k2、k1 (SQL 不保证返回顺序,它可能会有所不同)。那会丢掉你的分页。

于 2010-02-23T14:08:17.607 回答