【问题标题】:Ordered union query with pagination带分页的有序联合查询
【发布时间】:2014-12-11 17:27:30
【问题描述】:

对于一个查询,这个可以正常工作:

SELECT * 
FROM  
   ( SELECT ROW_NUMBER() OVER (ORDER BY id_article DESC) AS RowNum, 
            id_article, 
            article_name, ... 
     FROM articles 
) AS  RowConstrainedResult  
WHERE RowNum >=0 
      AND 
      RowNum <= 20 
ORDER BY  RowNum

现在我需要将第一个查询与同一个表中的另一个查询按日期和分页结果排序。

SELECT  articles.id_article AS ID, 
        articles.article_name AS NAME,
        articles.article_dateNew AS DATE 
FROM articles 
UNION 
SELECT  free_arts.id_art AS ID, 
        free_arts.art_name AS NAME, 
        free_arts.art_dateNew AS DATE 
FROM free_arts 
ORDER BY DATE DESC

【问题讨论】:

    标签: sql-server pagination


    【解决方案1】:
    SELECT * 
    FROM  
    (
         Select V1.* , ROW_NUMBER() OVER (ORDER BY DATE DESC) AS RowNum
         From
           (
              SELECT  articles.id_article AS ID, 
                      articles.article_name AS NAME,
                      articles.article_dateNew AS DATE 
              FROM articles 
              UNION -- All
              SELECT free_arts.id_art AS ID, 
                     free_arts.art_name AS NAME, 
                     free_arts.art_dateNew AS DATE 
              FROM free_arts               
            ) as V1           
      )
    WHERE RowNum >=0 
          AND
          RowNum <= 20 
    --ORDER BY  RowNum
    

    【讨论】:

    • 感谢评论,但现在返回错误:ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效,除非还指定了 TOP 或 FOR XML .
    • 欢迎来到维基好友。我对我的答案进行了更新,可能会派上用场。您可以将您的排序逻辑转移到 ROW_NUMBER() OVER (ORDER BY ...)
    • @IgorIvanov ,我认为应该使用 Union All 而不是 Union ,因为两个 Table 都不同,所以两个 id 意味着不同的东西。另外,如果您使用的是 Sql Server 2012 或更高版本,那么您可以使用 OffSet,这可以减少你的一个选择语句,从而提高性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2018-10-27
    相关资源
    最近更新 更多