2017-10-17 4 views
0

私は、次のSQL構造ました:SQLページングされたクエリ

SELECT * FROM (
    SELECT subquery.* FROM (
     SELECT some_columns 
     FROM some_tables 
     WHERE junctions_critereas 
     GROUP BY some_columns 
     UNION 
     SELECT some_columns 
     FROM some_tables 
     WHERE junctions_critereas 
     GROUP BY some_columns) subquery 
    GROUP BY some_columns) 
WHERE ROWNUM > startRecord AND ROWNUM <= endRecord; 
  • を私は除外した場合ROWNUMは、クエリが33件のレコードを返しcriterea。
  • 私がstartRecord = 0とendRecord = 10を置くと、クエリは10個の最初の レコードを返します。
  • 私がstartRecord = 0とendRecord = 20を置くと、クエリは20個の最初のレコードを返します。
  • 私がstartRecord = 0とendRecord = 40を置くと、クエリは33レコードすべてを返します。
  • 私がstartRecord = 10とendRecord = 20を置くと、クエリはレコードを返しません。

最終的な場所をWHERE ROWNUM BETEEW startRecord AND endRecordに変更すると、同じ結果が得られます。

ここで何が起こっているのか知っている人もいますか?

+2

ここにあなたの例は 'ROWNUM startRecord'を探しているはずです。 – RToyo

答えて

2

(注:私は最初の条件は@RToyotaコメントで指摘するように、本当にROWNUM < startRecordであると仮定しています。)

は、Oracle documentationはこのことについて非常に明確である:

条件のテストのためROWNUMの値が正の整数 より大きい場合は常にfalseです。

SELECT * FROM employees 
    WHERE ROWNUM > 1; 

最初の行フェッチが1のROWNUMが割り当てられ、 条件偽を行う:例えば、このクエリは行を戻しません。フェッチされる2番目の行が最初の行になり、 にも1のROWNUMが割り当てられ、条件がfalseになります。すべての行 は、引き続き条件を満たさないため、行は戻されません。

Oracle 12cでは、OFFSET/FETCH NEXTを使用できます。以前のバージョンでは、row_number()を使用するか、オフセット付きのネストクエリを使用できます。

+0

私はこれを他の方法で解決しました...しかし、私は答えを投稿できません... – BrunoTS

関連する問題