代码之家  ›  专栏  ›  技术社区  ›  AGuyCalledGerald Omid.Hanjani

分页和自定义排序结果

  •  0
  • AGuyCalledGerald Omid.Hanjani  · 技术社区  · 15 年前

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

    1)“进入” 2)“条目” 3)“进入某物” 4)“..进入…”

    我通过Union All和4个不同的查询完成了这项工作。

    但是,另外,我想包括分页,这样我就可以接收行号1-100、101-200等。我尝试了行号()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 回复  |  直到 13 年前
        1
  •  0
  •   ktharsis    15 年前

    将联合查询作为派生表包装在另一个查询中,可以使用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%这样的*Where关键字,你可能会得到k1,k2,k3,k4,k5一次,k5,k4,k3,k2,k1下一次(sql不保证返回顺序,它可以不同)。那会使你的寻呼中断。