sql 怎么递归查询的方法:

有个部门表,假设有三个字段Id,deptId,upperDeptId,现在我想查询指定部门下的所有部门,该怎么办,不要用startwithconnectbyprior... 有个部门表,假设有三个字段Id,deptId,upperDeptId,现在我想查询指定部门下的所有部门,该怎么办,不要用start with connect by prior 展开
 我来答
大宝妈谈教育
高粉答主

2020-05-04 · 关注我不会让你失望
知道小有建树答主
回答量:3306
采纳率:100%
帮助的人:55.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]。执行结果如下:

Select*

来自test_connectt

从id=4开始

由nocyclepriort连接。p_id=t.i.

jiansongruan
2019-10-16
知道答主
回答量:1
采纳率:0%
帮助的人:693
展开全部

WITH TEMP  AS (SELECT Id,deptId,upperDeptId FROM   PRODCLAS WHERE  上级部门字段=''  UNION ALL
SELECT B.Id,B.deptId,B.upperDeptId FROM   TEMP A
INNER JOIN 部门资料表 B ON B.上级部门字段 = A.当前部门字段)

SELECT 当前部门 FROM TEMP

向下递归查询

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
南霸天mxw
推荐于2017-09-29 · 知道合伙人教育行家
南霸天mxw
知道合伙人教育行家
采纳数:6329 获赞数:169960
本人毕业于河西学院计算机系,本科学位,自2008年毕业以来任九年级数学教师至今。

向TA提问 私信TA
展开全部
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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
enolong
推荐于2017-10-05 · TA获得超过1174个赞
知道小有建树答主
回答量:590
采纳率:100%
帮助的人:376万
展开全部
递归查询貌似只是oracle单独提供出来的。其他数据库没有提供递推查询吧。。。。

我当时做的项目是通过一个公司查出所有的子公司和子公司的子公司。。。
我做第一个项目的时候就是用的start with connect by prior做的。没找到其他递归方法。。

第二个项目的时候,这种树形结构有可能无限层,这个时候start with connect by prior也就不可靠了,速度慢。如果这个表可以新增一个字段,建议你加一个字段,当时我取名叫nodeIds,varchar类型的,用来存放父类的nodeIds+自己的id。
比如说顶层部门的id为1,那么该部门的nodeIds就是,1,,然后他下一层部门id是2,则这个部门的nodeIds的值就是,1,2,....id是2的部门的下一层部门id为3的话,则这个部门的nodeIds的值就是,1,2,3,,这样的话,你就完全好查询的。。。通过传入id所对应的部门的nodeIds去like一下,就获得了他及其所有子部门。
比如你要查id是1的所有子部门,那么你就拿,1,去数据库like一下,那么,1, ,1,2, ,1,2,3, 都拿出来了。。。后面两个肯定是前面那个的子部门。。。

不知道这样讲你能不能看懂,不懂再追问哈。
追问
嗯,你说的这个方法貌似可行,但是使用like的查询的话,他是全表查询,如果表很大的话,会导致负载过大吧。start with   connect by prior这个只用oracle有,其实我现在用的是jpql,jpql是不支持这个语法的,所以想找个别的方法。我想你这个方法还不错,谢了
追答
如果层数过多,这个应该算是一种较优的算法了,我反正还没见过比这个好的解决大量层递归查询的方法。这个方法当然也不是我想出来的,我还没那么大本事。这个算法在10亿条数据之内绝对不可能慢的。因为我一个朋友是在一个数据量相当庞大的公司工作的(这个公司我不方便透露),这个想法就是从他那里借鉴的,他们都是采用新增一个字段代替递归查询。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式