UNION ALL的排序分页问题

SQLSERVER中分页语句通常需要排序,如果同时要对UNION ALL子句排序的话就会遇到一些问题.


有一个很简单的SQL,它实现了按C_A排序并且分页.

  SELECT C_A,
         C_B,
         C_C
    FROM T_A
ORDER BY C_A OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY

但是需求有了变化,查询的SQL变成T_A+T_B,用上了UNION ALL,依然要按C1排序并且分页,但是T_A的结果必须在T_B前面,无脑一想改成了这样…

          (
              SELECT C_A,
                     C_B,
                     C_C
                FROM T_A
            ORDER BY C_A
          )
UNION ALL (
              SELECT C_A,
                     C_B,
                     C_C
                FROM T_B
            ORDER BY C_A
          )

突然发现UNION ALL子句里面不能加ORDER BY,这…瞬间就不爽了…,一时没招百度了下,得到下面改法.

   SELECT *
     FROM (
              SELECT TOP 99.999999 PERCENT C_A,
                     C_B,
                     C_C
                FROM T_A
            ORDER BY C_A
          ) TMP1
UNION ALL 
   SELECT *
     FROM (
              SELECT TOP 99.999999 PERCENT C_A,
                     C_B,
                     C_C
                FROM T_B
            ORDER BY C_A
          ) TMP2

TOP 100 PERCENT排序还会失效,所以用了99.999999,太丧心病狂了.
紧接着一想,不对啊,我还要分页啊,分页里面还得加排序,那么在子句里面排序还有个毛用,白忙一场…想出上面方法的大神用tempdb来解决,真心接受不了.

后来…我决定这么干.

          (
            SELECT C_A,
                   C_B,
                   C_C,
                   0   AS TMP_ORDER
              FROM T_A
          )
UNION ALL (
            SELECT C_A,
                   C_B,
                   C_C,
                   1   AS TMP_ORDER
              FROM T_B
          )
 ORDER BY TMP_ORDER,
          C_A OFFSET 0 ROWS FETCH NEXT 50 ROWS ONLY

我这智商也就能想出这种办法了,算是解决问题了…

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值