本帖最后由 jxydhzw 于 2009-10-15 13:11:36 编辑

解决方案 »

  1.   

    1. with tt as(select '1号棒' 接力棒,'李一' 当前传递人,'李二' 下个接棒人 from dual
      union all select '1号棒' ,'李二' ,'李三'  from dual
      union all select '1号棒' ,'李三' ,'李四'  from dual)select 接力棒,count(1)+1 from tt t
      connect by 当前传递人=prior 下个接棒人
      start with not exists(select 1 from tt where 下个接棒人=t.当前传递人 and 接力棒=t.接力棒)
    group by 接力棒
      

  2.   

    wildwave  大哥:还有问题2。和问题3呢。。好人做到底吧。。我正在消化你的代码。。
      

  3.   

    2.with tt as(select '1号棒' 接力棒,'李一' 当前传递人,'李二' 下个接棒人 from dual
      union all select '1号棒' ,'李二' ,'李三'  from dual
      union all select '1号棒' ,'李三' ,'李四'  from dual
      union all select '1号棒' ,'李四' ,'刘一'  from dual
      union all select '2号棒' ,'刘一' ,'刘二'  from dual
      union all select '2号棒' ,'刘三' ,'张一'  from dual
      union all select '3号棒' ,'张一' ,'张二'  from dual
      union all select '3号棒' ,'张二' ,'张三'  from dual
      union all select '3号棒' ,'张三' ,'王一'  from dual
      union all select '4号棒' ,'王一' ,'王五'  from dual)
      
    select count(1) from tt t
      connect by 当前传递人=prior 下个接棒人
      start with 下个接棒人='张二'3.
    with tt as(select '1号棒' 接力棒,'李一' 当前传递人,'李二' 下个接棒人 from dual
      union all select '1号棒' ,'李二' ,'李三'  from dual
      union all select '1号棒' ,'李三' ,'李四'  from dual
      union all select '1号棒' ,'李四' ,'刘一'  from dual
      union all select '2号棒' ,'刘一' ,'刘二'  from dual
      union all select '2号棒' ,'刘三' ,'张一'  from dual
      union all select '3号棒' ,'张一' ,'张二'  from dual
      union all select '3号棒' ,'张二' ,'张三'  from dual
      union all select '3号棒' ,'张三' ,'王一'  from dual
      union all select '4号棒' ,'王一' ,'王五'  from dual)
      
    select count(distinct 接力棒) from tt t
      connect by 当前传递人=prior 下个接棒人
      start with 当前传递人='张二'
      

  4.   

    2.
    with tt as(select '1号棒' 接力棒,'李一' 当前传递人,'李二' 下个接棒人 from dual
      union all select '1号棒' ,'李二' ,'李三'  from dual
      union all select '1号棒' ,'李三' ,'李四'  from dual
      union all select '2号棒' ,'李四' ,'王一'  from dual
      union all select '2号棒' ,'王一' ,'王二'  from dual
      union all select '2号棒' ,'王二' ,'王三'  from dual)
    select count(1)+1 FROM
    (
      select rownum rn,下个接棒人 from tt t
      connect by 当前传递人=prior 下个接棒人
      start with 当前传递人='李一'
      order by rownum 
    )t
    where rn<(
      select rn from (  select rownum rn,下个接棒人 from tt t
      connect by 当前传递人=prior 下个接棒人
      start with 当前传递人='李一'
      order by rownum 
      )t where  下个接棒人='王二')
      

  5.   

    用存储过程一个function负责返回传入参数的‘下个接棒人’的值,
    一个procedure负责执行查找,调用function
      

  6.   

    偶滴个神呐。牛人出现啦我还有一个问题我现在用的是oracle9i2,这种代码肯定没问题。。但是,客户端还有一个单机数据库是SQLite3。。单机库要实现这种功能。。怎么办?楼上那几个牛人大哥的代码在SQLite下能执行吗?或者有没有折中的办法?
      

  7.   

    SQLite3?这个是什么数据库,是MS SQL?如果不是oracle 那个start with, connecty by 就不能用了!只能想其他办法!
      

  8.   

    要自己定义下个接棒人的话
    with tt as(select '1号棒' 接力棒,'李一' 当前传递人,'李二' 下个接棒人 from dual
      union all select '1号棒' ,'李二' ,'李三'  from dual
      union all select '1号棒' ,'李三' ,'李四'  from dual
      union all select '1号棒' ,'李四' ,'刘一'  from dual
      union all select '2号棒' ,'刘一' ,'刘二'  from dual
      union all select '2号棒' ,'刘三' ,'张一'  from dual
      union all select '3号棒' ,'张一' ,'张二'  from dual
      union all select '3号棒' ,'张二' ,'张三'  from dual
      union all select '3号棒' ,'张三' ,'王一'  from dual
      union all select '4号棒' ,'王一' ,'王五'  from dual)
      
    select abs(sum(l*power(-1,rownum)))+1 num from(
      select 当前传递人,下个接棒人,level l from tt t
        connect by 当前传递人=prior 下个接棒人
        start with 当前传递人='张二')
    where 当前传递人='张二' or 下个接棒人='王五'

    with tt as(select '1号棒' 接力棒,'李一' 当前传递人,'李二' 下个接棒人 from dual
      union all select '1号棒' ,'李二' ,'李三'  from dual
      union all select '1号棒' ,'李三' ,'李四'  from dual
      union all select '1号棒' ,'李四' ,'刘一'  from dual
      union all select '2号棒' ,'刘一' ,'刘二'  from dual
      union all select '2号棒' ,'刘三' ,'张一'  from dual
      union all select '3号棒' ,'张一' ,'张二'  from dual
      union all select '3号棒' ,'张二' ,'张三'  from dual
      union all select '3号棒' ,'张三' ,'王一'  from dual
      union all select '4号棒' ,'王一' ,'王五'  from dual)
      
    select count(1) from(
      select 当前传递人,下个接棒人,level l from tt t
        connect by 当前传递人=prior 下个接棒人 and prior 当前传递人<>'王五'
        start with 当前传递人='张二')
    或with tt as(select '1号棒' 接力棒,'李一' 当前传递人,'李二' 下个接棒人 from dual
      union all select '1号棒' ,'李二' ,'李三'  from dual
      union all select '1号棒' ,'李三' ,'李四'  from dual
      union all select '1号棒' ,'李四' ,'刘一'  from dual
      union all select '2号棒' ,'刘一' ,'刘二'  from dual
      union all select '2号棒' ,'刘二' ,'刘三'  from dual
      union all select '2号棒' ,'刘三' ,'张一'  from dual
      union all select '3号棒' ,'张一' ,'张二'  from dual
      union all select '3号棒' ,'张二' ,'张三'  from dual
      union all select '3号棒' ,'张三' ,'王一'  from dual
      union all select '4号棒' ,'王一' ,'王五'  from dual)
      
    ,c as(select 当前传递人,下个接棒人,level l from tt t
      connect by 当前传递人=prior 下个接棒人
      start with not exists(select 1 from tt where 下个接棒人=t.当前传递人)
     )
    select b.l-a.l+1 from (select * from c where 当前传递人='张二')a,(select * from c where 下个接棒人='王五')b
      

  9.   

    SQLite3  是一种基与文件型的关系数据库,有点像Access。但是比它有强。。cosio  你没接触过吗?因为客户端还要缓存一些数据。所以选用SQLite3。。晕。。你和wildwave的代码非常牛不知道有没有在SQLite3下能执行,并且能够实现这种功能的
      

  10.   

    没有用过,这种数据库,不懂它的函数有哪些?不过可以写成shiyiwan 说的,写成函数来执行!
      

  11.   

    SQLITE没听说过,估计ORACLE专用的函数没法用的
      

  12.   

    sqlite不会用,所以不知道怎么写能执行
    connect by在非oracle的环境应该是没法运行的,不过你可以写个函数来实现
    比如
    create or replace function func(str1 in varchar2,str2 in varchar2)return number
    as 
    v_name varchar2(10):=str1;
    num number:=0;
    begin
      loop
        select 下个接棒人 into v_name from tt where 当前传递人=v_name;
        num:=num+1;
        exit when v_name=str2;
      end loop;
    return num;
    exception
      when others then
        return 0;
    end func;
        然后调用
    select func('张二','王五') from dual这样写的话要注意语法问题,这个是按oracle的语法写的
      

  13.   

    SQLite不支持存储过程。郁闷。。怎么解决??继续等待解决方案
      

  14.   

    支持视图,,,Firebird支持上面的函数吗??我现在单机也向实现这种功能但是SQLite不支持。那我只有换其他单机数据库了