数据库表comms,有3个字段:
id     name       parentid
11     煤炭         null
1101   烟煤优混     11
1102   无烟煤优混   11
12     成品油       null
1201   柴油         12
120101 柴油0#      1201
1202   汽油         12
120201 汽油93#     1202我想要通过sql计算出每个品种是否是最末级,每个大类分几级不确定。目标结果:
id     name       parentid   isEndLevel
11     煤炭         null         0
1101   烟煤优混     11           1
1102   无烟煤优混   11           1
12     成品油       null         0
1201   柴油         12           0
120101 柴油0#      1201         1
1202   汽油         12           0
120201 汽油93#     1202         1

解决方案 »

  1.   

    这个比较简单,定制一个函数,或者是直接update也可以的。
    Create or replace function F_IsEndLevel(Pid in number) return int
    is
       pid int;
    begin
       select count(*) from Ytab where Parentid=pid;
       --pid表示需要调用的行的id
       if Pid=0 then 
          return 1;
       else
          return 0;
       end if;     
    end;
      

  2.   

    -_-,没太看懂我想要用sql直接写出来的!我尝试了用start with...connect by prior..,但是没整出来
    还是谢谢你!
      

  3.   

    start .....with ...connect  by 可以解决问题的
      

  4.   

      简单的来说,如果是查询,这样就可以了。
      select id,pid,F_IsEndLevel(id) from Ytab;
      --如果要再简化,可以这样。
      select id,pid,(select case count(*) when 0 then 1 else 0
                       from Ytab b where b.id=a.id) as IsEndLevel
                             From Ytab;
      

  5.   

    最末级记录的查询语句select * From comms a
    where not exists 
    (select 1 from comms b
    where b.parentid=a.id);
      

  6.   

    select   id,pid,(select   case   count(*)   when   0   then   1   else   0 
                                          from   Ytab   b   where   b.id=a.id)   as   IsEndLevel 
                                                      From   Ytab;
    b.id=a.id中的a.id是什么??
      

  7.   

    最好是修改你的应用。当新增下级的时候,就update新增记录 IsendLevel字段为1,然后修改其直接上级的isEndLeve 为0,作删除的时候也要去维护。这样就是要多写一些语句,但是查询方便。
    要么就是用sql动态查询
      

  8.   

    这个品种表已经建好,有是否末级这个字段。现在我要写一个树形菜单,能够应用于各个系统不同的品种表,这些品种表只有id和parentid是共有字段,有的表有是否末级这个字段,有的没有!我想只用这两个字段来判断出每条记录是否是末级,写成一个工具类的树型菜单。
      

  9.   

    Create or replace function F_IsEndLevel(pid in number) return int 
    is 
          pid int; 
    begin 
          select count(*) from espc_mmp_comms_gnxh where Parentid=pid; 
          --pid表示需要调用的行的id 
          if pid=0 then   
                return 1; 
          else 
                return 0; 
          end if;           
    end; 执行这个报错
    Compilation errors for FUNCTION MMS.F_ISENDLEVELError: PLS-00410: RECORD,TABLE 或参数列表中的字段不允许重复
    Line: 1
    Text: create or replace function F_IsEndLevel(pid in number) return intError: PL/SQL: Compilation unit analysis terminated
    Line: 0
    Text: create or replace function F_IsEndLevel(pid in number) return int我不太懂oracle的函数,请楼上大哥帮忙啊!
      

  10.   

    我 cao,我犯傻比了,光想着计算级别了。
    用minus解决了!
    (select c.id from espc_mmp_comms_gnxh c) minus (select d.parentid id from espc_mmp_comms_gnxh d where d.parentid is not null)