表A
supv  subo
4       5
3       4
2       3
1       2如何获取下列结果
supv4 supv3 supv2 supv1 subo
1      2     3     4     5

解决方案 »

  1.   

    就是一个存储着管理者与被管理着的关系。supv是管理者,subo是管理者下面的员工。我想把所有的关系都查询出来。
      

  2.   

    with t(supv, subo) as (
              select 4, 5 from dual
    union all select 3, 4 from dual
    union all select 2, 3 from dual
    union all select 1, 2 from dual
    )
    select max(decode(l, 1, supv)) supv4,
           max(decode(l, 2, supv)) supv3,
           max(decode(l, 3, supv)) supv2,
           max(decode(l, 4, supv)) supv1,
           max(subo) subo
           from (
           select supv, subo, level l from t start with supv=1 connect by prior subo = supv
           ) t1;
      

  3.   

    with t(supv, subo) as (
              select 4, 5 from dual
    union all select 3, 4 from dual
    union all select 2, 3 from dual
    union all select 1, 2 from dual
    )
    select max(decode(l, 1, supv)) supv4,
           max(decode(l, 2, supv)) supv3,
           max(decode(l, 3, supv)) supv2,
           max(decode(l, 4, supv)) supv1,
           max(subo) subo
           from (
           select supv, subo, level l from t start with supv=1 connect by prior subo = supv
           ) t1;
      

  4.   

    with t(supv, subo) as (
              select 4, 5 from dual
    union all select 3, 4 from dual
    union all select 2, 3 from dual
    union all select 1, 2 from dual
    )
    select max(decode(l, 1, supv)) supv4,
           max(decode(l, 2, supv)) supv3,
           max(decode(l, 3, supv)) supv2,
           max(decode(l, 4, supv)) supv1,
           max(subo) subo
           from (
           select supv, subo, level l from t start with supv=1 connect by prior subo = supv
           ) t1;
      

  5.   


    如果是没有规律的数字呢?这个sql也不能实现啊??比如我把5改成10 把4改成7。
      

  6.   


    可以啊,
    with t(supv, subo) as (
              select 7, 10 from dual
    union all select 3, 7 from dual
    union all select 2, 3 from dual
    union all select 1, 2 from dual
    )
    select max(decode(l, 1, supv)) supv4,
           max(decode(l, 2, supv)) supv3,
           max(decode(l, 3, supv)) supv2,
           max(decode(l, 4, supv)) supv1,
           max(subo) subo
           from (
           select supv, subo, level l from t start with supv=1 connect by prior subo = supv
           ) t1; 结果:
    SUPV4  SUPV3   SUPV2 SUPV1  SUBO                   
    ------ ------- ----- ------ -----
    1      2       3     7      10   
    你只要把start with supv=1 这里的1改成根节点的supv的值就行啊
      

  7.   

    谢谢你的解释。
    可以解释下A和B的区别吗?
    -- A
     select supv, subo, level l from t start with supv=1 connect by prior subo = supv
    -- B
     select supv, subo, level l from t start with supv=1 connect by prior supv = subo 
      

  8.   


    这是定义父子关系,
    prior subo = supv,说明supv是父节点;
    prior supv = subo,说明subo是父节点;看你的数据,supv是父节点。
      

  9.   

    谢谢你还有热心回帖的朋友。问题已经解决了!!--A
    select supv, subo, level l from t start with supv=3 connect by prior subo = supv
    --B
    select supv, subo, level l from t start with supv=3 connect by prior supv = subo
    --C
    select supv, subo, level l from t start with subo=3 connect by prior supv = subo
    --D
    select supv, subo, level l from t start with subo=3 connect by prior subo = supv 能给出上面四条语句的解释吗?我在网上查了start with connect by的用法,但还是不是很清楚。谢谢大家了!!