sql >> データベース >  >> RDS >> Oracle

複雑な結合クエリに対して、ORACLEでOFFSETとLIMITを適用しますか?

    ROW_NUMBER()などの分析関数を使用できます Oracle 11gのサブクエリ内 OFFSET 3 LIMIT 8をキャプチャするために、3番目から8番目の間にランク付けされた行を取得する必要があると仮定します。 Oracle DB内のロジック(実際、これらの句はバージョン12c+に含まれています )、結果をCREATE_DATEでグループ化する必要がある場合はいつでも IDで並べ替えられます 部門の:

    SELECT q.*
      FROM (SELECT DEPT.ID rowobjid,
                   DEPT.CREATOR createdby,
                   DEPT.CREATE_DATE createddate,
                   DEPT.UPDATED_BY updatedby,
                   DEPT.LAST_UPDATE_DATE updateddate,
                   DEPT.NAME name,
                   DEPT.STATUS status,
                   statusT.DESCR statusdesc,
                   REL.ROWID_DEPT1 rowidDEPT1,
                   REL.ROWID_DEPT2 rowidDEPT2,
                   DEPT2.DEPT_FROM_VAL parentcid,
                   DEPT2.NAME parentname,
                   ROW_NUMBER() OVER (PARTITION BY DEPT.CREATE_DATE ORDER BY DEPT.ID) AS rn
              FROM TEST.DEPT_TABLE DEPT
              LEFT JOIN TEST.STATUS_TABLE statusT
                ON DEPT.STATUS = statusT.STATUS
              LEFT JOIN TEST.C_REL_DEPT rel
                ON DEPT.ID = REL.ROWID_DEPT2
              LEFT JOIN TEST.DEPT_TABLE DEPT2
                ON REL.ROWID_DEPT1 = DEPT2.ID) q
     WHERE rn BETWEEN 3 AND 8;
    

    正確に6を返します (8-3 + 1)行。同点(各作成日の部門IDの等しい値)を含める必要がある場合は、ROW_NUMBER() DENSE_RANK()と呼ばれる別のウィンドウ関数に置き換える必要があります クエリの他のすべての部分は同じままです。 少なくとも6 この場合、レコードが返されます。




    1. JARアップグレード後にシンボルPreparedStatementが見つかりません

    2. Solveはクエリ内でDML操作を実行できません

    3. 行を更新するときに重複キーエラーが発生するのはなぜですか?

    4. OracleデータベースをSQLAzureと同期する