表org_member(人员信息)ID       Name     org_department_id      org_account_id  
---------------------------------------------------------
c001     张三          a01                   b01                    
c002     李四          a04                   b01
c003     王五          a05                   b02
c004     陈丽          a06                   b01
c005     刘勇          a07                   b01
c006     赵东          a08                   b01
c007     马晓          a02                   b03
c008     宁可          a03                   b04
表org_department(部门信息)ID       Name     org_account_id         path
---------------------------------------------------------
a01     财务部        b01              01.02
a02     人事部        b01              01.03
a03     业务部        b03              01.04
a04     综合科        b03              01.03.01
a05     综合科        b03              01.02.01
a06     后勤科        b03              01.04.01
a07     后勤科        b01              01.02.01
a08     出纳科        b01              01.02.02表org_account(单位信息)ID       Name 
---------------------------------------------------------
b01     华北区
b02     华东区
b03     华南区
b04     华西区最终要实现的查询结果:ID      Name      单位名称      部门名称        二级部门名称
-------------------------------------------------------------
c001     张三      华北区       财务部         
c002     李四      华北区       业务部             综合科
c003     王五      华东区       财务部             综合科
c004     陈丽      华北区       业务部             后勤科   
c005     刘勇      华北区       财务部             后勤科
c006     赵东      华北区       财务部             出纳科
c007     马晓      华南区       人事部
c008     宁可      华西区       业务部其中需要说明的是:表org_department 表中的path 字段,他表示部门的层次等级关系,要特别留意。

解决方案 »

  1.   

    二层就硬编吧,大概这样
    select id,name,deptname,accname,e.name subdept from
    (select a.*,b.id deptid,b.name deptname,b.path deptpath,c.id accid,c.name accname from org_member a
    left join org_department b on a.org_department_id= b.id
    left join ora_account c on a.org_account_id=c.id
    ) d
    left join org_account e on d.deptpath=e.path
      

  2.   

    select id,name,dwmc,qy,(select Name from org_department where path = tab2.yiji) yiji_name,
    (select Name from org_department where path = tab2.path) erji_name from (
    select a.id,a.name,b.name dwmc,c.name qy,strsub(path,1,5) yiji,path from (
    (select id,name,org_department_id,org_account_id from org_member ) a
    left outer join 
    (select id,name,path from org_department) b
    on a.org_department_id = b.id
    left outer join
    (select id,name from org_account) c
    on a.org_account_id = c.id ) tab ) tab2join后嵌套下..比较容易~
      

  3.   

    解释下.你表设计的id name过多.我避免混淆.都给取别名了..注意识别..我写的dwmc 就是指在哪个部门..qy就是指区域..如果你的path是固定格式.那么我就取这个Path的前5个字符进行判断..只需要找出对应的.就肯定是一级部门咯..我定义的别名是yiji_name.二级就更好说了..直接放后面.加分加分...
      

  4.   

    .....难道我的SQL语句不能解决?
      

  5.   

    初学者,顺便来灌水!
    select disctinct a.id as ID,
                     a.name as Name,
                     c.name as 单位名称,
                     b.name as 部门名称,
                     e.Name as 二级部门名称 
    from org_member a,org_department b,org_account c,(select Name,ID from org_department where LENGTH(path ) = 5) e where a.org_account_id = b.org_account_id and b.id = c.id a.org_department_id=e.id;
      

  6.   


    select e.member_id,e.member_name, e.acount_name,e.department_name,f.NAME from (
    select  d.PATH,d.NAME from  org_department  d where length(d.PATH)=8
    ) f right join 
    (select  b.id member_id,b.name member_name,a.name acount_name,c.NAME department_name ,c.PATH from  
    org_account a , org_member b, org_department c
    where   b.ORG_DEPARTMENT_ID = c.ID(+) and b.ORG_ACCOUNT_ID = a.id(+) 
    group by  b.id,b.name,a.name,c.NAME ,c.PATH
    )e
    on  substr(f.path,0,5) = substr(e.path,0,5)
    group by e.member_id,e.member_name, e.acount_name,e.department_name,f.NAME
      

  7.   

    我觉得PATH的值不应该是这样找的,因为,二级和三级都有一个对应关系,比如01.03.01
    ,他的上一级肯定是01.03,但是长度不见得固定,要以"."作为分级的标准来考虑,
      

  8.   

    ....你的思路有问题.path虽然是用01.03.02之类的分割了.但是每个在你的表里面有对应的列..我只管找到对应的NAME而已..根据长度来区分是否是一级NAME或者是二级NAME..
      

  9.   

    -- 先把创建表、插入数据的代码贴上:CREATE TABLE org_member(
      ID varchar2(10), 
      Name varchar2(16),
      org_department_id varchar2(8),
      org_account_id varchar2(8)
    );INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c001','张三','a01','b01');
    INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c002','李四','a04','b01');
    INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c003','王五','a05','b02');
    INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c004','陈丽','a06','b01');
    INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c005','刘勇','a07','b01');
    INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c006','赵东','a08','b01');
    INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c007','马晓','a02','b03');
    INSERT INTO org_member(ID,Name,org_department_id,org_account_id) values('c008','宁可','a03','b04');COMMIT;CREATE TABLE org_department(
      ID varchar2(10), 
      Name varchar2(16),
      org_account_id varchar2(8)
      path varchar2(100)
    );INSERT INTO org_department(ID,Name,org_account_id,path) values('a01','财务部','b01','01.02');
    INSERT INTO org_department(ID,Name,org_account_id,path) values('a02','人事部','b01','01.03');
    INSERT INTO org_department(ID,Name,org_account_id,path) values('a03','业务部','b03','01.04');
    INSERT INTO org_department(ID,Name,org_account_id,path) values('a04','综合科','b03','01.03.01');
    INSERT INTO org_department(ID,Name,org_account_id,path) values('a05','综合科','b03','01.02.01');
    INSERT INTO org_department(ID,Name,org_account_id,path) values('a06','后勤科','b03','01.04.01');
    INSERT INTO org_department(ID,Name,org_account_id,path) values('a07','后勤科','b01','01.02.01');
    INSERT INTO org_department(ID,Name,org_account_id,path) values('a08','出纳科','b01','01.02.02');COMMIT;CREATE TABLE org_account(
      ID varchar2(10), 
      Name varchar2(16)
    );INSERT INTO org_account(ID,Name) values('b01','华北区');
    INSERT INTO org_account(ID,Name) values('b02','华东区');
    INSERT INTO org_account(ID,Name) values('b03','华南区');
    INSERT INTO org_account(ID,Name) values('b04','华西区');COMMIT;
    -- 楼主:求别人帮忙,一些搭建的测试代码,最好自己事先给出!这样:别人为您这问题的解答欲望会强一些!
      

  10.   

    SELECT om.ID, om.Name, oa.Name as "单位名称", 
           (case when od1.Name not like '%部' then od2.Name else od1.Name end) as "部门名称", 
           (case when od1.Name like '%科' then od1.Name else '' end) as "二级部门名称"
    FROM org_member om left join org_account oa on oa.ID = om.org_account_id
                       left join org_department od1 on od1.ID = om.org_department_id
                       left join org_department od2 on substr('.'||od1.path||'.',instr('.'||od1.path||'.','.',1,1)+1,instr('.'||od1.path||'.','.',1,2)-instr('.'||od1.path||'.','.',1,1)-1)=substr(od2.ID,2)
    ORDER BY om.ID;
    ID                   NAME       单位名称                         部门名称                         二级部门名称
    -------------------- ---------- -------------------------------- -------------------------------- --------------------------------
    c001                 张三       华北区                           财务部
    c002                 李四       华北区                           财务部                           综合科
    c003                 王五       华东区                           财务部                           综合科
    c004                 陈丽       华北区                           财务部                           后勤科
    c005                 刘勇       华北区                           财务部                           后勤科
    c006                 赵东       华北区                           财务部                           出纳科
    c007                 马晓       华南区                           人事部
    c008                 宁可       华西区                           业务部已选择8行。