表如下格式(父与子是多对多的关系)
Parent_Dwg_No Parent_Rev_No Dwg_No Dwg_Rev0029SAA 001 0029GAP 004
0029GAP 004 5247GAK 007
0029GAP 004 5247GAS 005
0029GAP 004 5247GBJ 002

5247GBJ 003 0098GCJ 000
5247GBJ 003 0223GAM 001
5247GBJ 003 0118GBL 000能否通过0223GAM 001找到根0029SAA 001

解决方案 »

  1.   

    如果只有一级,可以用SQL解决,否则用VBA递归调用解决
      

  2.   

    查找所有根节点,但是数据量大时,就非常慢,有没有办法优化sql
    SELECT DISTINCT (RTRIM(Parent_Dwg_No)+RTRIM(Parent_Rev_No)) AS prt_dwg_no
    FROM Rt_basic_data
    WHERE RTRIM(Parent_Dwg_No) + RTRIM(Parent_Rev_No) not in (select (RTRIM(Dwg_No) + RTRIM(Dwg_Rev)) as dwgno from Rt_basic_data);
      

  3.   

    建立 冗余字段,保存RTRIM(Parent_Dwg_No) + RTRIM(Parent_Rev_No)的值,在此字段上建立索引
      

  4.   

    如何把握这句改成left join on模式
      

  5.   

    SELECT DISTINCT (RTRIM(Parent_Dwg_No)+RTRIM(Parent_Rev_No)) AS prt_dwg_no
    FROM Rt_basic_data a left join Rt_basic_data b 
    on RTRIM(a.Parent_Dwg_No) + RTRIM(a.Parent_Rev_No)=RTRIM(b.Dwg_No) + RTRIM(b.Dwg_Rev)
    WHERE b.Dwg_N is null
      

  6.   


    报错,该特定字段‘Parent_Dwg_No’可以参考sql语句中FROM子句列表中的多个表
      

  7.   

    自己不能修改一下吗?
    SELECT DISTINCT (RTRIM(a.Parent_Dwg_No)+RTRIM(a.Parent_Rev_No)) AS prt_dwg_no
    FROM Rt_basic_data a left join Rt_basic_data b  
    on RTRIM(a.Parent_Dwg_No) + RTRIM(a.Parent_Rev_No)=RTRIM(b.Dwg_No) + RTRIM(b.Dwg_Rev)
    WHERE b.Dwg_N is null
      

  8.   

    SELECT DISTINCT (RTRIM(Parent_Dwg_No)+RTRIM(Parent_Rev_No)) AS prt_dwg_no
    FROM Rt_basic_data t 
    WHERE not exists (select 1 from Rt_basic_data where Dwg_No=t.Dwg_No and Dwg_Rev=t.Dwg_Rev);
      

  9.   

    还是left join效率高啊
    查看了些资料,改用ORACAL,里面有start with 可以生树状图,能满足我这个要求
      

  10.   

    select *
      from (select Parent_Dwg_No, Parent_Rev_No, rownum num
              from Rt_basic_data
             start with Dwg_No||Dwg_Rev = '0223GAM001'
            connect by prior Parent_Dwg_No||Parent_Rev_No = Dwg_No||Dwg_Rev
             order by num DESC)
     where rownum = 1
      

  11.   

    TKS,这种写法输出结果是
    1 5247GBJ 002 2
    我想要得到的结果是
            0029SAA 001