2016-11-17 64 views
1

我使用的是SQL選擇從表中數據的記錄特定的範圍內。 我正在使用rownum來實現更大和更小的邏輯來達到所需的數據集。 使用下面的sql我可以從我的表中獲取從21到40的記錄。此條件表總共包含100行。 通過這個SQL我想獲取一個指示器(值),它告訴該條件有更多的記錄。如何尋找是否有表中的多個記錄使用Oracle 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; 

回答

1

您可以將count(*) over() total_rows添加到您的內心select。這會告訴你內部查詢將返回多少行,但不包含謂詞。然而,這意味着每次你要求一頁結果時,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,當你選擇20時)不是一個「指標」 - 它仍然不表示任何東西,除非你將它的值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 
; 
相關問題