我有一个下面的表
ORG组织表
ORG_ID (组织ID ) , ORG_NM(组织名字),ORG_PARENTID(父组织ID)
   1                    11111               0
   2                    22222               1
   3                    33333               1
   4                    44444               2
   5                     5555               4大家知道
select ORG_ID from ORG where ORG_PARENTID=1
可以查出下面这些数
  2
  3现在我想用一条SQL实现下面这个表
   ORG_ID     ORG_PARENTID
   2                 2
   3                 3
  4                   2
  5                   2也就是说要查出select ORG_ID from ORG where ORG_PARENTID=1
的ORG_ID的子ID(如果有下一层组织, 查出来的ORG_ID一定是下层的组织ID, 比如说5,因为它有上层组织4,4而有上层组织2, 所以对应的是2, 也就是要查出子ORG_ID对应的最上层ORG_ID(select ORG_ID from ORG where ORG_PARENTID=1))

解决方案 »

  1.   

    写的很丑
    select org_id,org_nm,org_PARENTID,
    case when ORG_PARENTID='1' then org_id
    else 
    (select min(ORG_PARENTID)
    from org
    start with ORG_ID=o.ORG_ID
    connect by prior ORG_PARENTID= org_id and ORG_PARENTID<>'1') end
    from org o
    start with ORG_PARENTID='1'
    connect by prior  org_id=ORG_PARENTID
    order by org_id
    ;主要问题:5的上级机构怎么是2,判断ORG_PARENTID='1' then org_id
    否则就是递归最小的ORG_PARENTID.
      

  2.   

    start with 
    你用两个start with , 如果数据多的话,你的数据库就爆了, 
      

  3.   

    不知道是不是这个意思 ... try it ... sql:  select distinct zz.ORG_ID,
                      zz.ORG_NM,
                      decode(instr(ltrim(first_value(zz.path)
                                         over(partition by zz.ORG_ID,
                                              zz.ORG_NM order by zz.lev desc),
                                         ','),
                                   ','),
                             0,
                             ltrim(first_value(zz.path)
                                   over(partition by zz.ORG_ID,
                                        zz.ORG_NM order by zz.lev desc),
                                   ','),
                             substr(ltrim(first_value(zz.path)
                                          over(partition by zz.ORG_ID,
                                               zz.ORG_NM order by zz.lev desc),
                                          ','),
                                    1,
                                    instr(ltrim(first_value(zz.path)
                                                over(partition by zz.ORG_ID,
                                                     zz.ORG_NM order by zz.lev desc),
                                                ','),
                                          ',') - 1)) as f_value
        from (select tt.*,
                     sys_connect_by_path(ORG_PARENTID, ',') as path,
                     level lev
                from ORG tt
               start with tt.ORG_PARENTID <> 0
              connect by prior tt.ORG_ID = tt.ORG_PARENTID) zz;result:    ORG_ID     ORG_NM F_VALUE
    ---------- ---------- --------------------------------------------------------------------------------
             2      22222 1
             3      33333 1
             4      44444 1
             5       5555 1
      

  4.   

    mantisXF 是高手, 谢谢了
      

  5.   

    SELECT ORG_ID,
    Decode(lv, 2, SubStr(x, InStr(x,'$',1,2)+1), 
    SubStr(x, InStr(x,'$',1,2)+1, InStr(x,'$',1,3)-InStr(x,'$',1,2)-1)) AS y
    FROM 
    (SELECT ORG_ID, sys_connect_by_path(ORG_ID,'$') AS x, LEVEL AS lv
    FROM ORG
    WHERE ORG_ID <> 1
    START WITH ORG_ID=1
    CONNECT BY ORG_PARENTID=PRIOR ORG_ID)
      

  6.   

    THANKS bugchen888 HTTP://WWW.1JU.ORG