表的内容如下:
id comp_name level_id belong_to_id(所属公司) addr
1 上海总公司 1 0 XX路
2 浦东分公司 2 1 XX路
3 杨浦分公司 2 1 XX路
4 徐汇分公司 2 1 XX路 我的查询语句如下:select a.id,a.comp_name,(case a.level_id when 1
then '总公司' when 2 then '分公司' end) as comp_level,(case b.id when a.belong_to_id then b.comp_name
end) as xxx
,a.addr
from company a,(select id,comp_name from company where level_id=1) b查询出的内容如下:
id comp_name comp_level belong_to_id(所属公司) addr
1 上海总公司 总公司 0 XX路
2 浦东分公司 分公司 上海总公司 XX路
3 杨浦分公司 分公司 上海总公司 XX路
4 徐汇分公司 分公司 上海总公司 XX路
请大家帮帮忙帮我把这条语句优化一下,我不是太熟悉这种连接,语句是乱打乱撞弄出来的,不知道效率怎么样~
谢谢了~
id comp_name level_id belong_to_id(所属公司) addr
1 上海总公司 1 0 XX路
2 浦东分公司 2 1 XX路
3 杨浦分公司 2 1 XX路
4 徐汇分公司 2 1 XX路 我的查询语句如下:select a.id,a.comp_name,(case a.level_id when 1
then '总公司' when 2 then '分公司' end) as comp_level,(case b.id when a.belong_to_id then b.comp_name
end) as xxx
,a.addr
from company a,(select id,comp_name from company where level_id=1) b查询出的内容如下:
id comp_name comp_level belong_to_id(所属公司) addr
1 上海总公司 总公司 0 XX路
2 浦东分公司 分公司 上海总公司 XX路
3 杨浦分公司 分公司 上海总公司 XX路
4 徐汇分公司 分公司 上海总公司 XX路
请大家帮帮忙帮我把这条语句优化一下,我不是太熟悉这种连接,语句是乱打乱撞弄出来的,不知道效率怎么样~
谢谢了~
--1.Hierarchical Queries: START WITH and CONNECT BY PRIOR clauses
--Hierarchical Queries
--START WITH and CONNECT BY PRIOR clauses.SELECT employee_id, manager_id, first_name, last_name
FROM employee_jh
START WITH employee_id = 1
CONNECT BY PRIOR employee_id = manager_id;EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME
----------- ---------- ---------- ----------
1 0 James Smith
2 1 Ron Johnson
3 2 Fred Hobbs
5 2 Rob Green
4 1 Susan Jones
6 4 Jane Brown
9 6 Henry Heyson
7 4 John Grey
8 7 Jean Blue
10 1 Kevin Black
11 10 Keith Long
12 10 Frank Howard
13 10 Doreen Penn13 rows selected.--2.Using a Subquery in a START WITH Clause
SELECT LEVEL,
LPAD(' ', 2 * LEVEL - 1) || first_name || ' ' || last_name AS employee
FROM employee_jh
START WITH employee_id = (SELECT employee_id FROM employee_jh WHERE first_name = 'Kevin' AND last_name = 'Black')
CONNECT BY PRIOR employee_id = manager_id; LEVEL EMPLOYEE
---------- -------------------------
1 Kevin Black
2 Keith Long
2 Frank Howard
2 Doreen Penn--3.Including Other Conditions in a Hierarchical Query
SELECT LEVEL,
LPAD(' ', 2 * LEVEL - 1) || first_name || ' ' ||
last_name AS employee, salary
FROM employee_jh
WHERE salary <= 50000
START WITH employee_id = 1
CONNECT BY PRIOR employee_id = manager_id; LEVEL EMPLOYEE SALARY
---------- ------------------------- ----------
3 Rob Green 40000
3 Jane Brown 45000
4 Henry Heyson 30000
3 John Grey 30000
4 Jean Blue 29000
3 Keith Long 50000
3 Frank Howard 45000
3 Doreen Penn 470008 rows selected.
如果没有
SELECT id,comp_name,
Decode(level_id,1,'总公司','分公司') comp_level,
(SELECT comp_name FROM company WHERE level_id=a.belong_to_id ) xxx,addr
FROM company a如果有,那么要看你具体什么需求了,可以用递归 start with ...connect by 树状结构构造,
不过递归层次多了,效率比较低
start with ... connect by 这个对于现在的我有点小困难~
不知道start with ... connect by能不能取出我想要的效果。。
谢谢~
--id comp_name level_id belong_to_id(所属公司) addr
SELECT 1 id,'上海总公司' comp_name,1 level_id,0 belong_to_id,'XX路1' addr FROM dual UNION ALL
SELECT 2,'浦东分公司',2,1,'XX路2' FROM dual UNION ALL
SELECT 3,'杨浦分公司',2,1,'XX路3' FROM dual UNION ALL
SELECT 4,'徐汇分公司',2,1,'XX路4' FROM dual
)
SELECT id,comp_name,
Decode(level_id,1,'总公司','分公司') comp_level,
(SELECT comp_name FROM company WHERE level_id=a.belong_to_id ) xxx,addr
FROM company a
ID COMP_NAME COMP_LEVEL XXX ADDR
--------------------------------------------
1 上海总公司 总公司 XX路1
2 浦东分公司 分公司 上海总公司 XX路2
3 杨浦分公司 分公司 上海总公司 XX路3
4 徐汇分公司 分公司 上海总公司 XX路4
SELECT id,comp_name,
Decode(level_id,1,'总公司','分公司') comp_level,
connect_by_root(comp_name) xxx,addr
FROM company
START WITH belong_to_id=0
CONNECT BY PRIOR level_id=belong_to_id
ORDER BY id
---普通的连接
sys@ORCL> ed
已写入 file afiedt.buf 1 with tb as(
2 SELECT 1 id,'上海总公司' comp_name,1 level_id,0 belong_to_id,'XX路1' addr FROM dual UNION ALL
3 SELECT 2,'浦东分公司',2,1,'XX路2' FROM dual UNION ALL
4 SELECT 3,'杨浦分公司',2,1,'XX路3' FROM dual UNION ALL
5 SELECT 4,'徐汇分公司',2,1,'XX路4' FROM dual
6 )
7 select a.id,a.comp_name,decode(a.level_id,1,'总公司','分公司') level_name,
8 (select comp_name from tb where level_id=1 and level_id=a.belong_to_id),
9 addr
10* from tb a
sys@ORCL> / ID COMP_NAME LEVEL_ (SELECTCOM ADDR
----------- ---------- ------ ---------- -----
1. 上海总公司 总公司 XX路1
2. 浦东分公司 分公司 上海总公司 XX路2
3. 杨浦分公司 分公司 上海总公司 XX路3
4. 徐汇分公司 分公司 上海总公司 XX路4已用时间: 00: 00: 00.07--用递归
sys@ORCL> ed
已写入 file afiedt.buf 1 with tb as(
2 SELECT 1 id,'上海总公司' comp_name,1 level_id,0 belong_to_id,'XX路1' addr FROM dual UNION ALL
3 SELECT 2,'浦东分公司',2,1,'XX路2' FROM dual UNION ALL
4 SELECT 3,'杨浦分公司',2,1,'XX路3' FROM dual UNION ALL
5 SELECT 4,'徐汇分公司',2,1,'XX路4' FROM dual
6 )
7 select id,comp_name,connect_by_root(comp_name) lev_name,
8 decode(connect_by_isleaf,1,'分公司','总公司') lev,addr
9 from tb
10 start with level_id=1
11* connect by belong_to_id= prior level_id
sys@ORCL> / ID COMP_NAME LEV_NAME LEV ADDR
----------- ---------- ---------- ------ -----
1. 上海总公司 上海总公司 总公司 XX路1
2. 浦东分公司 上海总公司 分公司 XX路2
3. 杨浦分公司 上海总公司 分公司 XX路3
4. 徐汇分公司 上海总公司 分公司 XX路4已用时间: 00: 00: 00.07