有个部门表dept(如下):code name
------------
01      公司
0101    办公室
0102    财务部
0103    销售部
010301  销售部1组
010302  销售部2组
......要求写个select语句,实现如下的效果(数据库分别是oracle9、10):code name parent_code
-----------------------------
01      公司
0101    办公室     01
0102    财务部     01
0103    销售部     01
010301  销售部1组  0103
010302  销售部2组  0103

解决方案 »

  1.   

    update aa set NEXT_REPORT_M_ID=(
      select NEXT_REPORT_M_ID from (
        select aa.REPORT_M_ID NEXT_REPORT_M_ID, t.REPORT_M_ID from aa,
               (select aa.*, kk.PARENT_CODE from aa left join kk on aa.ORG_CODE = kk.ORG_CODE) t
        where aa.ORG_CODE = t.PARENT_CODE
      ) tmp
      where aa.REPORT_M_ID=tmp.REPORT_M_ID
    );
      

  2.   

    如果你的code字段很有规律,就是按目前这个规律的话,可以考虑截取。
    select code ,name,substr(code ,1,length(code )-2) parent_code from tb_xxx;
    试一下。
      

  3.   

    楼主你的表达有问题,不可能毫无规律,如果是没有任何规律你就是用眼睛看你也分不出来他的parent_code应当是谁。
      

  4.   

    回9楼,实际用的代码都是英文,不是数字,比如bgs,cwb,xsb,xsb1,xsb2,jhfzb
      

  5.   

    Have a try.with t as
    (select '01' code,'公司' name from dual
    union all
    select '0101' code,'公司办公室' name from dual
    union all
    select '0102' code,'财务部' name from dual
    union all
    select '0103' code,'销售部' name from dual
    union all
    select '010301' code,'销售部1组' name from dual
    union all
    select '010302' code,'销售部2组' name from dual
    union all
    select '01030101' code,'销售部1组1号' name from dual
    )
    select t.code, t.name, a.code
      from t, t a
     where substr(t.code, 1, length(t.code) - 2) = a.code(+)
     order by t.code;
      

  6.   

    http://www.dbfaq.net/FAQ/FixupQL.aspx?QuestionID=40  这里是关于树型结构操作汇总。。可以参考。。
      

  7.   

    with t as
    (select '01' code,'公司' name from dual
    union all
    select '0101' code,'公司办公室' name from dual
    union all
    select '0102' code,'财务部' name from dual
    union all
    select '0103' code,'销售部' name from dual
    union all
    select '010301' code,'销售部1组' name from dual
    union all
    select '010302' code,'销售部2组' name from dual
    union all
    select '01030101' code,'销售部1组1号' name from dual
    )
    select t.code, t.name, a.code
      from t, t a
     where substr(t.code, 1, length(t.code) - 2) = a.code(+)
     order by t.code;
      

  8.   

    如果在这个前提下,这个SQL还是可行的:每个子部门的编号都是在父部门编号的基础上加2个数字CREATE TABLE foo(
         code VARCHAR2(10),
         NAME VARCHAR2(20)
    );
    INSERT INTO FOO VALUES('01','公司');
    INSERT INTO FOO VALUES('0101','办公室');
    INSERT INTO FOO VALUES('0102','财务部');
    INSERT INTO FOO VALUES('0103','销售部');
    INSERT INTO FOO VALUES('010301','销售部1组');
    INSERT INTO FOO VALUES('010302','销售部2组');--前提:每个子部门的编号都是在父部门编号的基础上加2个数字
    SELECT FOO.CODE, 
        FOO.NAME, 
        SUBSTR(FOO.CODE, 0, LENGTH(FOO.CODE) - 2) AS P_CODE
      FROM FOO;结果:
    01 公司
    0101 办公室 01
    0102 财务部 01
    0103 销售部 01
    010301 销售部1组 0103
    010302 销售部2组 0103
      

  9.   

    ......后面的回复没仔细看,没有规律不好搞,得出的结果会比较多应该是自关联,找两个code匹配且相差长度最小的.
      

  10.   


    CREATE TABLE foo(
         code VARCHAR2(20),
         NAME VARCHAR2(20)
    );
    INSERT INTO FOO VALUES('01x','公司');
    INSERT INTO FOO VALUES('01x01aaa','办公室');
    INSERT INTO FOO VALUES('01x02bbbb','财务部');
    INSERT INTO FOO VALUES('01x03cccccc','销售部');
    INSERT INTO FOO VALUES('01x03cccccc01d','销售部1组');
    INSERT INTO FOO VALUES('01x03cccccc02','销售部2组');SELECT A.CODE, A.NAME,MAX(B.CODE) AS P_CODE
      FROM FOO A, FOO B
     WHERE INSTR(A.CODE, B.CODE) > 0
       AND A.CODE <> B.CODE
       GROUP BY A.CODE,A.NAME
       ORDER BY 1结果:
    01x01aaa 办公室 01x
    01x02bbbb 财务部 01x
    01x03cccccc 销售部 01x
    01x03cccccc01d 销售部1组 01x03cccccc
    01x03cccccc02 销售部2组 01x03cccccc