现在有个分页查询,要依次执行两条语句,
一条取得符合条件的总行数,另一条来取得指定页的数据,分别如下
取得总行数
select max(RN) 总行数 from 
(SELECT row_number() over(order by ID desc) RN FROM Table1
 group by  SIGNATURE,GRADE,CITY,REG_TIME 
)t2结果
————
总行数
20000
取得第一页的行数
       select t2.* from 
       (
       SELECT SIGNATURE,GRADE,CITY,REG_TIME
               count(*) 小计,row_number() over(order by ID desc) 行序 
                       FROM Table1
                       WHERE GRADE=1 AND 
                       to_char(REG_TIME,'yyyy-mm-dd hh24:mi:ss') <='2010-12-23 23:59:59'
                       group by SIGNATURE,GRADE,CITY,REG_TIME
         )t2 where RN > 1 and RN <= 10结果
————
SIGNATURE   GRADE   CITY      REG_TIME       小计    行序
wow          1       lg         .....          15      1
wow          1       ttt        .....          44      2
wow2         3       fsdd       .....          600     3
wow3         1       dfsf       .....          233     4
wow3         2       rehhh      .....          322     5
........
问题:这两个操作都很耗时,每个大概30秒左右,不知道能不能合为一个比较高效的语句,
执行一次就可得到下面的结果总行数    SIGNATURE   GRADE   CITY      REG_TIME       小计    行序
20000      wow          1       lg         .....          15      1
20000      wow          1       ttt        .....          44      2
20000      wow2         3       fsdd       .....          600     3
20000      wow3         1       dfsf       .....          233     4
20000      wow3         2       rehhh      .....          322     5
...........谢谢指教

解决方案 »

  1.   


     select t2.*
       from (SELECT count(*) over(order by 1) totalrow,
                    SIGNATURE,
                    GRADE,
                    CITY,
                    REG_TIME count(*) 小计,
                    row_number() over(order by ID desc) 行序
               FROM Table1
              WHERE GRADE = 1
                AND to_char(REG_TIME, 'yyyy-mm-dd hh24:mi:ss') <=
                    '2010-12-23 23:59:59'
              group by SIGNATURE, GRADE, CITY, REG_TIME) t2
      where RN > 1
        and RN <= 10
      

  2.   

    --试试这个
    SELECT t2.*
      FROM (SELECT SIGNATURE, GRADE, CITY, REG_TIME, COUNT(*) over() 总计,
                    COUNT(*) over(PARTITION BY SIGNATURE, GRADE, CITY, REG_TIME) 小计,
                    row_number() over(PARTITION BY SIGNATURE, GRADE, CITY, REG_TIME ORDER BY ID DESC) 行序
               FROM Table1
              WHERE GRADE = 1
                AND to_char(REG_TIME, 'yyyy-mm-dd hh24:mi:ss') <=
                    '2010-12-23 23:59:59') t2
     WHERE RN > 1
       AND RN <= 10
      

  3.   

    用分析函数就可以解决总行数的显示了,至于效率应该也不差吧,因为你原来SQL就用到了分析函数来计算行序,只是再多一次并行的统计