这个递归怎么写?

Alex_V3T 2017-11-13 02:44:55
有两个表,A 部门表,存储部门ID 名称 上级部门;B表 存储部门员工表 ID 姓名 部门ID
现在我希望通过一条sql语句取得所有顶级部门下的员工(包含下级部门的员工)

顶级部门 张三
顶级部门 李四
顶级部门 王五
顶级部门 赵六
顶级部门 钱八
...全文
284 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
崽儿8023 2017-12-04
  • 打赏
  • 举报
回复
这个问题还是树的问题
碧水幽幽泉 2017-11-14
  • 打赏
  • 举报
回复

--1.创建测试表
create table t1(depno varchar2(10), depname varchar2(100), pre_depno varchar2(10));
create table t2(empno varchar2(10), empname varchar2(100), depno varchar2(10));

--2.添加测试语句
insert into t1 values('001', '顶级部门',null);
insert into t1 values('010', '部门1','001');
insert into t1 values('020', '部门2','001');
insert into t1 values('030', '部门3','020');


insert into t2 values(1,'赵六','010');
insert into t2 values(2,'李四','020');
insert into t2 values(3,'王五','020');
insert into t2 values(4,'张三','030');
insert into t2 values(5,'钱八','001');
commit;

--3.sql实现
select t1.depname,t2.empname
from t1, t2
where t1.depno = t2.depno
start with t1.pre_depno is null
connect by prior t1.depno = t1.pre_depno

自由自在_Yu 2017-11-14
  • 打赏
  • 举报
回复
上面条件写错了
with temp(emp_id,name,dept_id) as (
  select e.emp_id,e.name,e.dept_id from employ e left join dept d on e.dept_id = d.dept_id where e.dept_id = '1' 
  union all 
  select d2.emp_id,d2.name,d2.dept_id from temp t,
  ( select emp_id,name,e.dept_id,d3.up_id from employ e,dept d3 where e.dept_id = d3.dept_id)d2 where t.dept_id = d2.up_id
)
select distinct(emp_id),name,dept_id from temp order by emp_id;
自由自在_Yu 2017-11-14
  • 打赏
  • 举报
回复
--有两个表,A 部门表,存储部门ID 名称 上级部门;B表 存储部门员工表 ID 姓名 部门ID
--现在我希望通过一条sql语句取得所有顶级部门下的员工(包含下级部门的员工)
--drop table dept;
create table dept(
 dept_id varchar(5), 
 up_id varchar(5),
 misc varchar(20),
 primary key (dept_id)
);
INSERT INTO DEPT (DEPT_ID, UP_ID, MISC) VALUES ('12', '-', '顶级部门2');
INSERT INTO DEPT (DEPT_ID, UP_ID, MISC) VALUES ('1', '-', '顶级部门');
INSERT INTO DEPT (DEPT_ID, UP_ID, MISC) VALUES ('01', '1', '部门1');
INSERT INTO DEPT (DEPT_ID, UP_ID, MISC) VALUES ('02', '1', '部门2');
INSERT INTO DEPT (DEPT_ID, UP_ID, MISC) VALUES ('003', '02', '部门3');
--drop table employ;
create table employ(
 emp_id varchar(6),
 name varchar(20),
 dept_id varchar(5),
 primary key(emp_id)
);
INSERT INTO EMPLOY (EMP_ID, NAME, DEPT_ID) VALUES ('00001', '钱八', '1');
INSERT INTO EMPLOY (EMP_ID, NAME, DEPT_ID) VALUES ('00002', '赵六', '01');
INSERT INTO EMPLOY (EMP_ID, NAME, DEPT_ID) VALUES ('00003', '王五', '02');
INSERT INTO EMPLOY (EMP_ID, NAME, DEPT_ID) VALUES ('00004', '李四', '02');
INSERT INTO EMPLOY (EMP_ID, NAME, DEPT_ID) VALUES ('00005', '张三', '003');


--查询部门为1-顶级部门下的所有员工
with temp(emp_id,name,dept_id) as (
  select e.emp_id,e.name,e.dept_id from employ e left join dept d on e.dept_id = d.dept_id where e.dept_id = '02' 
  union all 
  select d2.emp_id,d2.name,d2.dept_id from temp t,
  ( select emp_id,name,e.dept_id,d3.up_id from employ e,dept d3 where e.dept_id = d3.dept_id)d2 where t.dept_id = d2.up_id
)
select distinct(emp_id),name,dept_id from temp order by emp_id;
碧水幽幽泉 2017-11-13
  • 打赏
  • 举报
回复
非常简单的一个问题,采用向下递归,三五行左右代码就实现了。
碧水幽幽泉 2017-11-13
  • 打赏
  • 举报
回复
引用 2 楼 Alex_V3T 的回复:
[quote=引用 1 楼 wmxcn2000 的回复:]
楼主百度一下 oracle connect by prior

会有你的结果。


已经试过了,不行[/quote]
把A和B的建表语句贴出来,有insert语句最好。
我帮你写下SQL。
卖水果的net 2017-11-13
  • 打赏
  • 举报
回复
贴出测试数据和预期结果。 另外,也可以贴出你的语句,并说一下哪里不行。
Alex_V3T 2017-11-13
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:
楼主百度一下 oracle connect by prior 会有你的结果。
已经试过了,不行
卖水果的net 2017-11-13
  • 打赏
  • 举报
回复
楼主百度一下 oracle connect by prior 会有你的结果。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧