小编典典

对复杂的联接查询在ORACLE中应用OFFSET和LIMIT?

sql

我正在使用Oracle 11g并且有一个复杂的联接查询。在此查询中,我确实想应用OFFSET并有效地LIMIT使用它Spring BatchFramework

但是事情对我来说不是很清楚。

我的查询

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。


阅读 228

收藏
2021-04-07

共1个答案

小编典典

您可以ROW_NUMBER()在甲骨文的子查询中使用Analytic函数,例如,11g假设需要将行排列在第3到第8之间,以便捕获OFFSET 3LIMIT 8Oracle 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)行。如果您需要包括关系(每个创建日期部门标识的值相等),ROW_NUMBER()则应将其替换为另一个窗口函数DENSE_RANK(),因为查询的所有其他部分均保持不变。
这种情况下,将 至少 返回 6 条记录。

2021-04-07