我的表结构和数据为下面的
          节点字段 节点名称                    上级节点 节点的级数
         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 还是列出上面的数据.
要求性能好

解决方案 »

  1.   

    建议以后大家有类似问题的能够把表结构和数据的insert 导出了,贴到这里,这样直接可以用你的sql来建表和数据,节省大家好多时间哟。
      

  2.   

    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)
    )
      

  3.   

    最好把数据的data也做错了。你的数据和表头不一致
            org_no    org_name                  p_org_no org_type 
    1 3540702         惠安电力公司           35407 05 425 
    2 354070205 惠安崇武供电所营业厅 3540702 06 430 
      

  4.   

    用这个select做insert的数据
    SQL>select 'insert into O_ORG values('''||ORG_NO||''','''||ORG_NAME||''','''||P_ORG_NO||''','''||ORG_TYPE||''','||SORT_NO||');' sql from O_ORG
      

  5.   

    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');
    后面的数据可以不要了.大致明白俺的意思吧.
      

  6.   

    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 )   -----  查兄弟节点
      

  7.   

    select * from t where org_no like '3540702'||'%' or p_org_no ='3540702'
    '3540702' 可换成你的参数。 org_no 加索引 ,p_org_no 加索引
      

  8.   

    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) 
    )
      

  9.   

    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
      

  10.   

    答案好多哟。通过这些答案,感觉好像是找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