我正在使用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;
答案 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
;