2016-11-17 17 views
1

SQLを使用して特定のレコード範囲のテーブルからデータを選択しています。 私はrownumを使用して、必要以上のデータを得るためにロジックをより大きく、より少なく実装しています。 以下のSQLを使用すると、テーブルから21から40までのレコードを取得できます。この条件テーブルの合計には100行が含まれています。 このSQLを介して、この条件のレコードがさらにあることを示すインジケータ(値)をフェッチします。oracle sqlを使用してテーブルにレコードが複数あるかどうかを調べる方法

Googleで解決策が見つかりませんでした。 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; 

答えて

1

あなたはあなたの内selectcount(*) over() total_rowsを追加することができます。これは、内部クエリがrownum述部なしで返す行の数を示します。ただし、結果のページをリクエストするたびに、Oracleは内部問合せを完全に実行し、フェッチしていないすべての行を破棄する必要があります。それはあなたが現在、私は「より多くのレコードがあることを告げる指標」についての部分を理解してわからない

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

をやっているよりも高価になるだろう。インジケータはどのように見えるのでしょうか?それは何を "教え"てください。インジケータは通常0または1、または 'T'または 'F'で、それはあなたが意味するものですか?テーブル内のすべての行数を表示するだけで(100を選択すると100)、それは「インジケータ」ではありません。値100を何か他の値(おそらく20 )。とにかく

は、データセットを生成し、特定の順序の基準によって、21から40行のみを選択し、分析関数ROW_NUMBER()の代わりに、ORDER BYとROWNUMといくつかホーカス・ポーカスを使用します。同時に、解析バージョンcount()を使用してテーブルの合計行数(各行に表示)を生成し、すべてをサブクエリ/外部クエリ構造(ネストされたサブクエリなし)で実行できます。次のようなもの:

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