现在系统里有一张机构表,结构如下:--创建机构表
create table department (
dept_id number(10), --机构编号
parent_id number(10), --上级机构编号
dept_name varchar2(100), --机构名称
class number(10) --机构层级
);
--1级机构(总公司)
insert into department (dept_id,parent_id,dept_name,class) values (1,0,'上海总公司',1);
insert into department (dept_id,parent_id,dept_name,class) values (2,0,'北京总公司',1);--2级机构(分公司)
insert into department (dept_id,parent_id,dept_name,class) values (3,1,'上海浦东分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (4,1,'上海普陀分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (5,2,'北京中关村分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (6,2,'北京海淀区分公司',2);--3级机构(部门)
insert into department (dept_id,parent_id,dept_name,class) values (7,3,'上海浦东分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (8,3,'上海浦东分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (9,4,'上海普陀分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (10,4,'上海普陀分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (11,5,'北京中关村分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (12,5,'北京中关村分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (13,6,'北京海淀区分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (14,6,'北京海淀区分公司销售2部',3);
commit;另外还有一张用户表,结构如下:--创建用户表
create table usrtbl (
user_id number(10),
dept_id number(10),
user_name varchar2(10)
);insert into usrtbl (user_id,dept_id,user_name) values (1,3,'陈志强');
commit;
现要求查询出用户所属父机构、当前机构及其所有下属机构,比如用户在第2个层级,那么他只能看到他的上级机构、当前机构和下属所有机构,没有权限看到同级的其他机构。--查询机构表
select d.dept_id,lpad('-',level*2,'--')||d.dept_name as dept_name from department d
start with d.parent_id = 0
connect by prior d.dept_id = d.parent_id;各位有没有好办法,提供一个能实现该需求的SQL。递归子查询
create table department (
dept_id number(10), --机构编号
parent_id number(10), --上级机构编号
dept_name varchar2(100), --机构名称
class number(10) --机构层级
);
--1级机构(总公司)
insert into department (dept_id,parent_id,dept_name,class) values (1,0,'上海总公司',1);
insert into department (dept_id,parent_id,dept_name,class) values (2,0,'北京总公司',1);--2级机构(分公司)
insert into department (dept_id,parent_id,dept_name,class) values (3,1,'上海浦东分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (4,1,'上海普陀分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (5,2,'北京中关村分公司',2);
insert into department (dept_id,parent_id,dept_name,class) values (6,2,'北京海淀区分公司',2);--3级机构(部门)
insert into department (dept_id,parent_id,dept_name,class) values (7,3,'上海浦东分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (8,3,'上海浦东分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (9,4,'上海普陀分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (10,4,'上海普陀分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (11,5,'北京中关村分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (12,5,'北京中关村分公司销售2部',3);insert into department (dept_id,parent_id,dept_name,class) values (13,6,'北京海淀区分公司销售1部',3);
insert into department (dept_id,parent_id,dept_name,class) values (14,6,'北京海淀区分公司销售2部',3);
commit;另外还有一张用户表,结构如下:--创建用户表
create table usrtbl (
user_id number(10),
dept_id number(10),
user_name varchar2(10)
);insert into usrtbl (user_id,dept_id,user_name) values (1,3,'陈志强');
commit;
现要求查询出用户所属父机构、当前机构及其所有下属机构,比如用户在第2个层级,那么他只能看到他的上级机构、当前机构和下属所有机构,没有权限看到同级的其他机构。--查询机构表
select d.dept_id,lpad('-',level*2,'--')||d.dept_name as dept_name from department d
start with d.parent_id = 0
connect by prior d.dept_id = d.parent_id;各位有没有好办法,提供一个能实现该需求的SQL。递归子查询
解决方案 »
- 求一个单句SQL...
- 官网下的Oracle 10g能用吗,不需要注册码什么的吗
- oracle中如何更新clob字段的值~~~~~~~~
- imp 问题
- 创建包报错了,
- 关于SCN的理解问题
- 我想做数据库开发,后台用ORACLE8I/9I.请问前台用什么开发工具比较好一些,做C/S和B/S?
- 求sql plus的帮助文档和sql语句的帮助文档!
- 国内最好的ORACLE技术网站是哪一个?最好的技术论坛是哪个?地址?谢谢!
- 请问从Oracle网站(www.oracle.com)上下载的oracle9i是不是试用版?
- 请教关于oracle分区表中,如何判断一条数据到底在哪个分区中?
- 求select写法 oracle 11g(PLSQL)
查询上级/下级的sql不用我说吧,你应该能写出来。
2 START WITH D.PARENT_ID = 3
3 CONNECT BY D.DEPT_ID = PRIOR D.PARENT_ID
4 ORDER BY 1
5 / DEPT_ID DEPT_NAME
---------- ------------------------------
1 ------上海总公司
3 ----上海浦东分公司
7 --上海浦东分公司销售1部
8 --上海浦东分公司销售2部已选择4行。已用时间: 00: 00: 00.03
START WITH D.PARENT_ID = 3
CONNECT BY D.DEPT_ID = PRIOR D.PARENT_ID
UNION
xxxx
START WITH D.PARENT_ID = 3
CONNECT BY PRIOR D.DEPT_ID = D.PARENT_ID
union all
select d.dept_id,lpad(' ',level*2,' ')||d.dept_name as dept_name from department d
start with d.dept_id =3
connect by prior d.dept_id = d.parent_id ;