ORACLE树状查询

select * from balance_sheet  connect by prior balance_sheet.bs_id= balance_sheet.bs_pid start with balance_sheet.bs_pid=7 ;

其中 start with balance_sheet.bs_pid=7 ; 代表从哪个父ID开始查询

bs_id  : 实际id

bs_pid : 父id

connect by prior balance_sheet.bs_id= balance_sheet.bs_pid

 

可用参数:

level  当前节点所在深度

CONNECT_BY_ISLEAF 是否是叶子节点(1:是;0:否)

 

写道
SQL> select * from t_dept_temp;

DEPT_ID PARENT_ID DEPT_NAME AMOUNT
---------- ---------- ---------- ----------
1 1 2
2 1 1-2 15
3 1 1-3 8
4 2 1-2-4 10
5 2 1-2-5 9
6 3 1-3-6 17
7 3 1-3-7 5
8 3 1-3-8 6

已选择8行。

SQL> desc t_dept_temp;
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
DEPT_ID NOT NULL NUMBER(2)
PARENT_ID NUMBER(2)
DEPT_NAME VARCHAR2(10)
AMOUNT NUMBER(3)

接下来实现各种查询的测试:
1.查询dept_id=2以及所有下级部门:
SQL> select level treelevel,dept_id,parent_id,dept_name from t_dept_temp
2 start with dept_id=2
3 connect by parent_id = prior dept_id;

TREELEVEL DEPT_ID PARENT_ID DEPT_NAME
---------- ---------- ---------- ----------
1 2 1 1-2
2 4 2 1-2-4
2 5 2 1-2-5

2.查询dept_id=4以及所有上级部门:
SQL> select level treelevel,dept_id,parent_id,dept_name from t_dept_temp
2 start with dept_id=4
3 connect by dept_id = prior parent_id;

TREELEVEL DEPT_ID PARENT_ID DEPT_NAME
---------- ---------- ---------- ----------
1 4 2 1-2-4
2 2 1 1-2
3 1 1

3.查询dept_id=1以及所有下级部门:
SQL> select level treelevel,dept_id,parent_id,dept_name from t_dept_temp
2 start with dept_id=1
3 connect by parent_id = prior dept_id;

TREELEVEL DEPT_ID PARENT_ID DEPT_NAME
---------- ---------- ---------- ----------
1 1 1
2 2 1 1-2
3 4 2 1-2-4
3 5 2 1-2-5
2 3 1 1-3
3 6 3 1-3-6
3 7 3 1-3-7
3 8 3 1-3-8

已选择8行。

4.查询dept_id=1以及所有下级部门,但除了部门3 (排除树枝,部门3下的所有节点也都排除)
SQL> select level treelevel,dept_id,parent_id,dept_name from t_dept_temp
2 start with dept_id=1
3 connect by parent_id=prior dept_id and dept_id <> 3;

TREELEVEL DEPT_ID PARENT_ID DEPT_NAME
---------- ---------- ---------- ----------
1 1 1
2 2 1 1-2
3 4 2 1-2-4
3 5 2 1-2-5

5.查询dept_id=1以及所有下级部门,但除了部门3 (仅排除部门3,其下的所有节点都是包括的)
SQL> select level treeview, dept_id,parent_id,dept_name from t_dept_temp
2 where dept_id <> 3
3 start with dept_id=1
4 connect by parent_id = prior dept_id;

TREEVIEW DEPT_ID PARENT_ID DEPT_NAME
---------- ---------- ---------- ----------
1 1 1
2 2 1 1-2
3 4 2 1-2-4
3 5 2 1-2-5
3 6 3 1-3-6
3 7 3 1-3-7
3 8 3 1-3-8

已选择7行。
注意这里的where dept_id <> 3,他的执行是在connect by之后做的


 

### Oracle 数据库中的树形结构查询Oracle数据库中,处理树形结构的数据通常涉及使用`CONNECT BY`语句来实现递归查询。对于给定的员工表结构: ```sql CREATE TABLE employees ( id NUMBER PRIMARY KEY, name VARCHAR2(100) NOT NULL, manager_id NUMBER, CONSTRAINT fk_manager FOREIGN KEY (manager_id) REFERENCES employees(id) ); ``` 为了获取某个特定员工及其所有的上级管理者列表,可以构建如下SQL查询[^1]: ```sql SELECT LPAD(' ', LEVEL*2)||e.name AS employee_name, e.id FROM employees e START WITH e.id = :employee_id -- 替换为具体ID CONNECT BY PRIOR e.manager_id = e.id; ``` 此查询通过指定起始条件(`START WITH`)以及定义父子关系的方式(`CONNECT BY`)来进行层次化检索。 如果希望调整最终输出记录之间的排列次序而不仅仅是依据层级,则可以在上述基础上增加`ORDER SIBLINGS BY`子句[^2]: ```sql SELECT LPAD(' ', LEVEL*2)||e.name AS employee_name, e.id FROM employees e START WITH e.id = :employee_id CONNECT BY PRIOR e.manager_id = e.id ORDER SIBLINGS BY e.name ASC; -- 可按需求更改排序字段和方向 ``` 针对包含有`id`, `name`, 和 `parent_id`三个列名的通用域表(domain),要取得某条目下全部祖先路径上的名字集合,可采用以下方法[^3]: ```sql WITH RECURSIVE path_query AS( SELECT d.id, CAST(d.name AS VARCHAR2(4000)) as full_path FROM domain d WHERE d.parent_id IS NULL AND d.id=:target_id UNION ALL SELECT c.id, p.full_path || '->' || c.name FROM domain c JOIN path_query p ON c.parent_id=p.id ) SELECT DISTINCT full_path FROM path_query; ``` 请注意这里假设目标表格名为`domain`,并且存在一个唯一标识符作为入口参数`:target_id`. 对于想要获得某一节点下的所有后代成员的情况,可以通过修改`CONNECT BY`部分指向相反的方向,并设置合适的起点[^4]: ```sql SELECT * FROM tree_nodes tn START WITH tn.id=2 CONNECT BY PRIOR tn.id = tn.parent_id; ``` 以上就是几种常见的基于Oracle DBMS执行树状数据集操作的方法介绍.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值