CONNECT BY子句
适用于 ❌ 开源版 ✅ Express 版 ✅ 专业版 ✅ 企业版
Oracle 数据库知道一种非常简洁的语法来创建分层查询:CONNECT BY 子句,jOOQ 完全支持它,包括所有相关函数和伪列。 此处给出了此子句或多或少的正式定义
-- SELECT .. -- FROM .. -- WHERE .. CONNECT BY [ NOCYCLE ] condition [ AND condition, ... ] [ START WITH condition ] -- GROUP BY .. -- ORDER [ SIBLINGS ] BY ..
这是一个迭代查询的示例,它迭代 1 到 5 之间的值
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 5
// Get a table with elements 1, 2, 3, 4, 5 create.select(level()) .connectBy(level().le(5)) .fetch();
这是一个更复杂的示例,您可以在数据库中递归地获取目录,并将它们连接到路径
SELECT SUBSTR(SYS_CONNECT_BY_PATH(DIRECTORY.NAME, '/'), 2) FROM DIRECTORY CONNECT BY PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID START WITH DIRECTORY.PARENT_ID IS NULL ORDER BY 1
.select( substring(sysConnectByPath(DIRECTORY.NAME, "/"), 2)) .from(DIRECTORY) .connectBy( prior(DIRECTORY.ID).eq(DIRECTORY.PARENT_ID)) .startWith(DIRECTORY.PARENT_ID.isNull()) .orderBy(1) .fetch();
输出可能如下所示
+------------------------------------------------+ |substring | +------------------------------------------------+ |C: | |C:/eclipse | |C:/eclipse/configuration | |C:/eclipse/dropins | |C:/eclipse/eclipse.exe | +------------------------------------------------+ |...21 record(s) truncated...
一些支持的函数、运算符和伪列如下(可从 DSL 中获得)
- CONNECT_BY_ISCYCLE 函数
- CONNECT_BY_ISLEAF 函数
- CONNECT_BY_ROOT 运算符
- LEVEL 伪列
- PRIOR 运算符
- SYS_CONNECT_BY_PATH 函数
ORDER SIBLINGS
Oracle 数据库允许在 ORDER BY 子句中指定 SIBLINGS 关键字。 这不会对整体结果进行排序,而只会对彼此之间的同级进行排序,从而保持层次结构完整。 此处给出一个示例
SELECT DIRECTORY.NAME FROM DIRECTORY CONNECT BY PRIOR DIRECTORY.ID = DIRECTORY.PARENT_ID START WITH DIRECTORY.PARENT_ID IS NULL ORDER SIBLINGS BY 1
.select(DIRECTORY.NAME) .from(DIRECTORY) .connectBy( prior(DIRECTORY.ID).eq(DIRECTORY.PARENT_ID)) .startWith(DIRECTORY.PARENT_ID.isNull()) .orderSiblingsBy(1) .fetch();
反馈
您对此页面有任何反馈吗? 我们很乐意听到!