如果是只有A表的话,直接使用level就肯定可以解决现在主要是有C表,它与A表有主从关系,所以比较复杂

解决方案 »

  1.   

    试试:select c.id||'(aid)' id,a.aname from a,c where a.aid=c.cid
    union
    select c.id||'(bid)' id,'---'||b.bname from b,c where b.bid=c.bid;
      

  2.   

    to  bzszp(www.bzszp.533.net) :
    无法正确体现层次关系,层次可能是多级
      

  3.   

    SELECT * FROM (
              SELECT T.CID||'(AID)' ID,T.AID,T.ANAME,T.AFID,T.DEP FROM (
                     SELECT C.CID,A.AID,A.ANAME,B.BID,B.BNAME,A.AFID,DECODE(A.AFID,0,A.ANAME,(SELECT ANAME FROM AA WHERE AID=A.AFID)) DEP FROM CC C,BB B,AA A WHERE A.AID=C.AID AND B.BID=C.BID) T
              UNION
              SELECT TT.CID||'(CID)' ID,TT.BID AID,TT.BNAME ANAME,TT.AFID,TT.DEP FROM (
    SELECT C1.CID,A1.AID,A1.ANAME,B1.BID,B1.BNAME,A1.AFID,DECODE(A1.AFID,0,A1.ANAME,(SELECT ANAME FROM AA WHERE AID=A1.AFID)) DEP FROM CC C1,BB B1,AA A1 WHERE A1.AID=C1.AID AND B1.BID=C1.BID) TT) ORDER BY DEP,ID,AFID
    看看这个,有点麻烦,不过结果好像还成
    SQL> SELECT * FROM AA;       AID ANAME            AFID
    ---------- ---------- ----------
             1 财务部              0
             2 安全部              0
             3 会计处              1
             4 保安处              2SQL> SELECT * FROM BB;       BID BNAME
    ---------- ----------
             1 张
             2 李
             3 王
             4 孙SQL> SELECT * from cc;       CID        AID        BID
    ---------- ---------- ----------
             1          1          2
             2          2          3
             3          3          1
             4          4          4SQL> 
    SQL> SELECT * FROM (
      2            SELECT T.CID||'(AID)' ID,T.AID,T.ANAME,T.AFID,T.DEP FROM (
      3                   SELECT C.CID,A.AID,A.ANAME,B.BID,B.BNAME,A.AFID,DECODE(A.AFID,0,A.ANAME,(SELECT ANAME FROM AA WHERE AID=A.AFID)) DEP FROM CC C,BB B,AA A WHERE A.AID=C.AID AND B.BID=C.BID) T
      4            UNION
      5            SELECT TT.CID||'(CID)' ID,TT.BID AID,TT.BNAME ANAME,TT.AFID,TT.DEP FROM (
      6  SELECT C1.CID,A1.AID,A1.ANAME,B1.BID,B1.BNAME,A1.AFID,DECODE(A1.AFID,0,A1.ANAME,(SELECT ANAME FROM AA WHERE AID=A1.AFID)) DEP FROM CC C1,BB B1,AA A1 WHERE A1.AID=C1.AID AND B1.BID=C1.BID) TT) ORDER BY DEP,ID,AFID
      7  ;ID                                                   AID ANAME            AFID DEP
    --------------------------------------------- ---------- ---------- ---------- ----------
    2(AID)                                                 2 安全部              0 安全部
    2(CID)                                                 3 王                  0 安全部
    4(AID)                                                 4 保安处              2 安全部
    4(CID)                                                 4 孙                  2 安全部
    1(AID)                                                 1 财务部              0 财务部
    1(CID)                                                 2 李                  0 财务部
    3(AID)                                                 3 会计处              1 财务部
    3(CID)                                                 1 张                  1 财务部8 rows selectedSQL> 
      

  4.   

    to beckham:
    谢谢你的SQL,给我提示,帮我解决了问题
    select decode(DM,'S',0,'M',aid-10000) id,lpad(aname,(level-1)*2+lengthb(aname),'-') name from 
    (select * from 
    (select 'S' DM,aid,aname,afid from a
    union all
    select 'M' DM,10000+c.cid,b.bname,a.aid from a,b,c 
    where b.bid=c.bid and a.aid=c.aid)
    order by DM)
    connect by prior aid=afid start with afid=0其中的一些函数的使用和自定义字段的增加是为了满足我自己的需求:)
      

  5.   

    各位版主:
    beckhambobo(beckham)是通过MSN和我进行讨论和并帮助我写出了以上的sql语句!