在 ORACLE 中应用 OFFSET 和 LIMIT 进行复杂的连接查询?
Apply OFFSET and LIMIT in ORACLE for complex Join Queries?
我正在使用 Oracle 11g
并且有一个复杂的连接查询。在这个查询中,我真的很想应用 OFFSET
和 LIMIT
以便在 Spring Batch Framework
中有效地使用。
我经历了:
How do I limit the number of rows returned by an Oracle query after ordering? 和
Alternatives to LIMIT and OFFSET for paging in 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;
上面的查询给了我 1000 万条记录。
注意:两个数据库 table 都没有 PK,所以我需要使用 OFFSET 和 LIMIT。
您可以在 Oracle 11g
的子查询中使用 ROW_NUMBER()
等分析函数,假设您需要获取排名在第 3 和第 8 之间的行以捕获 OFFSET 3 LIMIT 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;
return正好是 6(8-3+1) 行。如果您需要包含关系(每个创建日期的部门标识的相等值),ROW_NUMBER()
应替换为另一个名为 DENSE_RANK()
的 window 函数,因为查询的所有其他部分仍然存在相同。 在这种情况下,至少有 6 条记录 return。
我正在使用 Oracle 11g
并且有一个复杂的连接查询。在这个查询中,我真的很想应用 OFFSET
和 LIMIT
以便在 Spring Batch Framework
中有效地使用。
我经历了: How do I limit the number of rows returned by an Oracle query after ordering? 和
Alternatives to LIMIT and OFFSET for paging in 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;
上面的查询给了我 1000 万条记录。
注意:两个数据库 table 都没有 PK,所以我需要使用 OFFSET 和 LIMIT。
您可以在 Oracle 11g
的子查询中使用 ROW_NUMBER()
等分析函数,假设您需要获取排名在第 3 和第 8 之间的行以捕获 OFFSET 3 LIMIT 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;
return正好是 6(8-3+1) 行。如果您需要包含关系(每个创建日期的部门标识的相等值),ROW_NUMBER()
应替换为另一个名为 DENSE_RANK()
的 window 函数,因为查询的所有其他部分仍然存在相同。 在这种情况下,至少有 6 条记录 return。