表的内容如下:
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.   

    树的查询?参考connect by
    --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.
      

  2.   

    楼主,你数据会有第三层分公司吗?
    如果没有
    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   树状结构构造,
    不过递归层次多了,效率比较低
      

  3.   

    暂时分不到第三层公司。
    start with ... connect by 这个对于现在的我有点小困难~
    不知道start with ... connect by能不能取出我想要的效果。。
    谢谢~
      

  4.   

    WITH company AS( 
    --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
      

  5.   

    你的也可以
    ---普通的连接 
    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