在oracle中为复杂的联接查询应用偏移量和限制?

bz4sfanl  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(331)

我在用 Oracle 11g 并有一个复杂的连接查询。在这个问题上我真的很想申请 OFFSET 以及 LIMIT 为了适应 Spring Batch Framework 有效地。
我经历了:如何限制排序后oracle查询返回的行数?和
oracle中分页限制和偏移的替代方法
但我不太清楚。
我的问题

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 
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
ORDER BY rowobjid asc;

上面的查询给了我一千万条记录。
注意:两个数据库表都没有pk,所以我需要使用offset和limit。

hgtggwj0

hgtggwj01#

您可以使用分析函数,例如 ROW_NUMBER() 在oracle的子查询中 11g 假设您需要获得排名在第3和第8之间的行,以便捕获 OFFSET 3 LIMIT 8 oracledb中的逻辑(实际上,这些子句包含在版本中) 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)行。如果需要包括关系(每个创建日期的部门标识值相等), ROW_NUMBER() 应替换为另一个名为 DENSE_RANK() 因为查询的所有其他部分保持不变。在这种情况下,至少会返回6条记录。

相关问题