将WITH RECURSIVE cte AS ( SELECT * FROM dept WHERE id = '指定ID' UNION ALL SELECT d.* FROM dept d INNER JOIN cte ON d.parent_id = cte.id)SELECT * FROM cte ORDER BY id;变成开窗函数
时间: 2024-02-25 12:53:32 浏览: 108
可以使用以下的开窗函数来替换递归查询:
```
SELECT id, name, parent_id,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY (SELECT NULL)) AS level
FROM (
SELECT id, name, parent_id,
CONNECT_BY_ROOT id AS root_id,
LEVEL
FROM dept
START WITH id = '指定ID'
CONNECT BY PRIOR parent_id = id
)
ORDER BY id;
```
这个查询使用了 Oracle 中的 CONNECT BY 语法来实现树形结构的查询,并使用 ROW_NUMBER() 开窗函数来为每个节点分配一个层级。其中,CONNECT_BY_ROOT 可以获取根节点的 ID,LEVEL 可以获取当前节点的深度。
相关问题
解析 WITH recursive dept_hierarchy AS ( SELECT deptid, deptname, fdeptid, 0 AS depth FROM enbogis.sys_dept WHERE deptid = #{area_code} UNION ALL SELECT d.deptid, d.deptname, d.fdeptid, dh.depth + 1 FROM enbogis.sys_dept d JOIN dept_hierarchy dh ON dh.fdeptid = d.deptid ) SELECT deptid, deptname FROM dept_hierarchy ORDER BY depth DESC;
这是一段 SQL 查询语句,使用了 WITH RECURSIVE 关键字进行递归查询。这段代码的作用是查询一个组织机构的层级关系,其中 #{area_code} 是一个变量,表示组织机构的编号。具体地说,这段代码定义了一个名为 dept_hierarchy 的递归查询,首先查询编号为 #{area_code} 的组织机构,然后再递归查询其下属的子组织机构,直到查询到最底层的组织机构。最后,按照层级顺序倒序排序,返回每个组织机构的编号和名称。
WITH RECURSIVE tb_deptrelation (dept_id, dept_f, deptpath) AS ( -- 初始查询 SELECT t1.dept_id, t1.dept_f, t1.dept_id FROM db_attendance.tb_dept AS t1 WHERE dept_f IS NULL UNION ALL -- 递归查询 SELECT t2.dept_id, t2.dept_f, t3.deptpath + '-' + t2.dept_f FROM db_attendance.tb_dept AS t2 JOIN tb_deptrelation t3 ON t2.dept_id = t3.dept_id ) SELECT dept_id, dept_f, deptpath FROM tb_deptrelation; 哪有问题
根据你提供的查询语句,目前我没有发现任何明显的问题。该查询使用了递归公共表表达式(CTE)来构建一个部门层级关系的结果集。
初始查询选择了 `db_attendance.tb_dept` 表中 `dept_f` 为NULL的行作为起始行,然后递归查询通过连接CTE本身来获取下一级部门,并使用字符串连接操作符将部门路径拼接起来。
最后的SELECT语句从CTE中选择了 `dept_id`、`dept_f` 和 `deptpath` 作为输出列。
如果你运行这个查询并没有得到预期的结果,请提供更多的上下文信息,例如表 `db_attendance.tb_dept` 的结构和示例数据,以及你期望得到的输出结果。这样我可以更好地帮助你解决问题。
阅读全文