我正在使用Oracle 11g并且有一个复杂的联接查询。在此查询中,我确实想应用OFFSET并有效地LIMIT使用它Spring BatchFramework。
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。
您可以ROW_NUMBER()在甲骨文的子查询中使用Analytic函数,例如,11g假设需要将行排列在第3到第8之间,以便捕获OFFSET 3LIMIT 8Oracle DB中的逻辑( 实际上,这些子句包含在版本中12c+),只要将结果分组即可由部门的CREATE_DATE命令ID:
ROW_NUMBER()
11g
OFFSET 3LIMIT 8
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 条记录。
DENSE_RANK()