求一sql关于调用递归树的 要求性能最优

sqiong 2009-07-08 10:40:23
我的表结构和数据为下面的
节点字段 节点名称 上级节点 节点的级数
org_no org_name p_org_no org_type
1 3540702 惠安电力公司 35407 05 425
2 354070205 惠安崇武供电所营业厅 3540702 06 430
3 354070201 惠安螺阳供电所营业厅 3540702 06 426
4 354070202 惠安辋川供电所营业厅 3540702 06 427
5 354070204 惠安东岭供电所营业厅 3540702 06 429
6 354070203 惠安涂寨供电所营业厅 3540702 06 428
7 354070206 惠安净峰供电所营业厅 3540702 06 431
8 354070207 惠安东园供电所营业厅 3540702 06 432
9 354070208 惠安洛阳供电所营业厅 3540702 06 433
10 354070209 惠安百崎供电所营业厅 3540702 06 434

只列出了 5,6 级的节点,现在的要求是 输入5,6级的任意一个节点字段,可以得到5,6级同上级单位的节点字段,只显示5 ,6级的.
比如我输入的节点字段为 354070205 ,就列出上面的数据,输入3540702 还是列出上面的数据.
要求性能好
...全文
130 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sqiong 2009-07-10
  • 打赏
  • 举报
回复
谢谢大家的回复,一会我去结贴.大家的意见很好,性能也比较好
suncrafted 2009-07-08
  • 打赏
  • 举报
回复
WITH TEMP AS
(
SELECT T.P_ORG_NO FROM O_ORG T
WHERE T.ORG_NO = '354070201' ---->更改你的输入。。。。
)

SELECT * FROM O_ORG T
WHERE EXISTS (SELECT 1 FROM TEMP TT WHERE TT.P_ORG_NO = T.ORG_NO ) ---- 查父节点
OR EXISTS (SELECT 1 FROM TEMP TT WHERE TT.P_ORG_NO = T.P_ORG_NO ) ----- 查兄弟节点
inthirties 2009-07-08
  • 打赏
  • 举报
回复
不是很明白哟
sqiong 2009-07-08
  • 打赏
  • 举报
回复
insert into O_ORG values('3540702','惠安电力公司',' 35407 ','05','425');
insert into O_ORG values(354070201' ,'惠安螺阳供电所营业厅','3540702','06','426');
insert into O_ORG values('354070202','惠安辋川供电所营业厅','3540702','06','427');
后面的数据可以不要了.大致明白俺的意思吧.
inthirties 2009-07-08
  • 打赏
  • 举报
回复
用这个select做insert的数据


SQL>select 'insert into O_ORG values('''||ORG_NO||''','''||ORG_NAME||''','''||P_ORG_NO||''','''||ORG_TYPE||''','||SORT_NO||');' sql from O_ORG
inthirties 2009-07-08
  • 打赏
  • 举报
回复
最好把数据的data也做错了。

你的数据和表头不一致
org_no org_name p_org_no org_type
1 3540702 惠安电力公司 35407 05 425
2 354070205 惠安崇武供电所营业厅 3540702 06 430
sqiong 2009-07-08
  • 打赏
  • 举报
回复
create table O_ORG
(
ORG_NO VARCHAR2(16) not null,
ORG_NAME VARCHAR2(256),
P_ORG_NO VARCHAR2(16),
ORG_TYPE VARCHAR2(8),
SORT_NO NUMBER(5)
)
inthirties 2009-07-08
  • 打赏
  • 举报
回复
建议以后大家有类似问题的

能够把表结构和数据的insert 导出了,贴到这里,

这样直接可以用你的sql来建表和数据,节省大家好多时间哟。

inthirties 2009-07-08
  • 打赏
  • 举报
回复
答案好多哟。

通过这些答案,感觉好像是找354070201的父节点和354070201的兄弟节点。

试试这个

select t2.* from O_ORG t1, O_ORG t2 where t1.org_no='354070201' and t1.p_org_no=t2.org_no;

union

select * from from O_ORG where p_org_no = (select * from O_ORG t1, O_ORG t2 where t1.org_no='354070201' and t1.p_org_no=t2.p_org_no);

在p_org_no和org_no上建index
laoding_dmf1982 2009-07-08
  • 打赏
  • 举报
回复
select ORG_NO,ORG_NAME,LEVEL from O_ORG where LEVEL<3 start with org_no=(select p_org_no from O_ORG where org_no='354070205') connect by prior org_no=p_org_no
sqiong 2009-07-08
  • 打赏
  • 举报
回复
如果是上级找下级,好找,现在是下级找上级和同级的...
sqiong 2009-07-08
  • 打赏
  • 举报
回复
7楼的,俺测试了下你的方法,觉得要是写在一个储存过程里面,感觉好点阿,
sqiong 2009-07-08
  • 打赏
  • 举报
回复
like 俺感觉影响速度阿,
asdf_ndsc 2009-07-08
  • 打赏
  • 举报
回复
才要两级 不用递归,和递归无关。
cab1225 2009-07-08
  • 打赏
  • 举报
回复
create table O_ORG
(
ORG_NO VARCHAR2(16) not null,
ORG_NAME VARCHAR2(256),
P_ORG_NO VARCHAR2(16),
ORG_TYPE VARCHAR2(8),
SORT_NO NUMBER(5)
)
asdf_ndsc 2009-07-08
  • 打赏
  • 举报
回复
select * from t where org_no like '3540702'||'%' or p_org_no ='3540702'
'3540702' 可换成你的参数。

org_no 加索引 ,p_org_no 加索引

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧