sql - 在 ORACLE 中应用 OFFSET 和 LIMIT 来处理复杂的联接查询?
问题描述
我正在使用Oracle 11g
并且有一个复杂的连接查询。在这个查询中,我真的很想申请OFFSET
并被有效地LIMIT
使用Spring Batch Framework
。
我经历过: 如何限制 Oracle 查询在订购后返回的行数?和
Oracle 中分页的 LIMIT 和 OFFSET 的替代方案
但事情对我来说不是很清楚。
我的查询
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 万条记录。
注意:两个数据库表都没有 PK,所以我需要使用 OFFSET 和 LIMIT。
解决方案
您可以使用分析函数,例如ROW_NUMBER()
在 Oracle 的子查询中,11g
假设您需要获得排名在第 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;
它恰好返回6 (8-3+1) 行。如果您需要包含关系(每个创建日期的部门标识的相等值),ROW_NUMBER()
则应替换为另一个称为窗口函数DENSE_RANK()
,因为查询的所有其他部分保持不变。在这种情况下,至少会返回 6 条记录。
推荐阅读
- jquery - 如何从两个不同的复选框值更改跨度文本
- c - 为什么允许`typedef struct xx`?
- javascript - Padding 防止元素渲染,Chrome v75 中的 Flexbox 错误
- mysql - 我正在使用按关键字分组,但它将“h”和“H”分组为一个
- shell - 为什么shell printf 在不引用时会一起运行字符串?
- java - 这个用于 2D 凸平面的凸壳算法叫什么?
- bash - 安装 Cygwin 后出错:bash:错误替换:没有关闭“`”
- c# - 使用 LINQ 从集合中选择所有字段以及另一个集合中的相关项
- json - 在 ruby 脚本中解析 JSON 文件并存储特定值
- python - 是否可以使用 Cerberus 验证 yaml 文件的键名和字典名称?