我有一个下面的表
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))
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))
解决方案 »
- OEM console 中在哪配置XML Database
- 登陆plsql出现12541错误 怎么办啊??
- 创建数据库的DATAFILE和init**.ora里面的参数db_files的关系?
- 关于审计的一个小细节。。
- ORACLE9I内如何设置让数据库每天自动定时执行一个存储过程的DBMS作业
- sys.odci_secobj$ 中最后的$符号是什么意思?
- 请问操作oracle的软件plsql,在输入一段过程后,有一个"/"加回车,请问"/"是什么意思?
- 建立倒序索引为什么会不起作用
- 请教各位关于VC访问ORACLE的示范程序
- Oracle truncate table xx 急救...
- ORACLE字符处理
- Windows server 20003 Sp2 企业版 安装 Oracle10g 出错
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.
你用两个start with , 如果数据多的话,你的数据库就爆了,
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
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)