递归查询数据库(递归查询)
大家好,小鑫来为大家解答以上的问题。递归查询数据库,递归查询这个很多人还不知道,现在让我们一起来看看吧!
1、1.创建测试表,createtabletest_connect(idnumber,p_idnumber);2.插入测试数据,Insertintotest_connectvalues(1,1);Insertintotest_connectvalues(2,1);Insertintotest_connectvalues(3,2);Insertintotest_connectvalues(4,3);提交;3.查询数据表的内容,选择*fromtest_connect,4.执行递归查询语句,将答案添加到nocycle元素中,就不会有[ora-01436:CONNECTBYerrorintheuserdata]。
2、执行结果如下:Select*来自test_connectt从id=4开始由nocyclepriort连接。
3、p_id=t.i.WITH TEMP AS (SELECT Id,deptId,upperDeptId FROM PRODCLAS WHERE 上级部门字段=' UNION ALLSELECT B.Id,B.deptId,B.upperDeptId FROM TEMP AINNER JOIN 部门资料表 B ON B.上级部门字段 = A.当前部门字段)SELECT 当前部门 FROM TEMP向下递归查询sql 递归查询的方法:方法一:T-SQL递归查询with Dep as ( select Id,DeptCode,DeptName from Department where Id=1 union all select d.Id,d.DeptCode,d.DeptName from Dep inner join Department d on dep.Id = d.ParentDeptId ) select * from Dep 方法二:PL/SQL递归查询select Id,DeptCode,DeptName from Department start with Id = 1 connect by prior Id = ParentDeptId;递归查询貌似只是oracle单独提供出来的。
4、其他数据库没有提供递推查询吧。
5、我当时做的项目是通过一个公司查出所有的子公司和子公司的子公司。
6、我做第一个项目的时候就是用的start with connect by prior做的。
7、没找到其他递归方法。
8、第二个项目的时候,这种树形结构有可能无限层,这个时候start with connect by prior也就不可靠了,速度慢。
9、如果这个表可以新增一个字段,建议你加一个字段,当时我取名叫nodeIds,varchar类型的,用来存放父类的nodeIds+自己的id。
10、比如说顶层部门的id为1,那么该部门的nodeIds就是,1,,然后他下一层部门id是2,则这个部门的nodeIds的值就是,1,2,....id是2的部门的下一层部门id为3的话,则这个部门的nodeIds的值就是,1,2,3,,这样的话,你就完全好查询的。
11、通过传入id所对应的部门的nodeIds去like一下,就获得了他及其所有子部门。
12、比如你要查id是1的所有子部门,那么你就拿,1,去数据库like一下,那么,1, ,1,2, ,1,2,3, 都拿出来了。
13、后面两个肯定是前面那个的子部门。
14、不知道这样讲你能不能看懂,不懂再追问哈。
本文到此分享完毕,希望对大家有所帮助。