如何使用oracle sql查找表中是否有更多记录

时间:2016-11-17 21:59:48

标签: sql oracle

我正在使用sql从表中选择特定记录范围的数据。 我使用rownum来实现更大和更小的逻辑来获得所需的数据集。 使用下面的sql我可以从我的表中获取21到40的记录。总共这个条件表包含100行。 通过这个SQL我想获取一个指示符(值),告诉该条件有更多的记录。

我在谷歌找不到任何解决方案。 Sql -

select * from ( select rownum rnum, a.* from(SELECT TO_CHAR(D.DATE,'YYYYMMDD'),D.TYPE, 
TO_CHAR(D.VDATE,'YYYYMMDD'),D.AMT,D.PARTICULAR,D.NUM,D.ID,
D.CODE,D.INFO FROM MySCHEMA
.MYTABLE D WHERE D.DATE >= TO_CHAR(TO_DATE('20160701','YYYYMMDD'),'DD-MON-RRRR') 
AND D.DATE <= TO_CHAR(TO_DATE('20161105','YYYYMMDD'),'DD-MON-RRRR') AND D.XDATE >= TO_CHAR(TO_DATE('20160701','YYYYMMDD'),'DD-MON-RRRR') 
AND D.XDATE <= TO_CHAR(TO_DATE('20161105','YYYYMMDD'),'DD-MON-RRRR') 
AND D.FLG='Y' AND D.TYPE IN('D','C') 
AND
 D.ACI = 'CO6'
 ORDER BY D.DATE  DESC
 )
a where rownum <= 40 ) where  rnum >= 21;

2 个答案:

答案 0 :(得分:1)

您可以向内部count(*) over () total_rows添加select。这将告诉您在没有rownum谓词的情况下内部查询将返回多少行。但是,这意味着每次要求提供结果页面时,Oracle都必须完全执行内部查询,然后丢弃所有未提取的行。这将比你目前正在做的更昂贵

select * 
  from ( select rownum rnum, a.* 
           from(SELECT count(1) over () total_rows,
                       <<the rest of your query>>

答案 1 :(得分:-1)

我不确定我是否理解了关于&#34;一个指示器,告诉我们有更多记录&#34;。该指标应该是什么样的,它应该如何告诉&#34;什么?指标通常为0或1,或者&#39; T&#39;或者&#39; F&#39;,这是你的意思吗?简单地显示表中所有行的计数(100,当您选择20时)不是&#34;指示符&#34; - 除非你将它的值100与其他东西(可能是20的值)进行比较,否则它仍然没有任何表示。

无论如何,要生成数据集并按特定顺序标准仅选择21到40之间的行,请使用分析函数row_number()而不是ORDER BY和一些带有rownum的hocus-pocus。同时,您可以使用分析版本count()生成表的总行数(显示在每一行!),并在子查询外部查询结构中执行所有操作(没有嵌套的子子查询) 。类似的东西:

select * from (
       select ......., row_number() over (order by d.date desc) as rn, 
                       count(*) over ()                         as ct
         )
where rn between 21 and 40
;