求论坛大佬帮忙看看以下SQL要如何写才可以获得我要的结果呀?已知:
表1
————————————————
目标部门 范围部门
A             B
D           D

表2
————————————————
部门  上级部门
A
B      A
C      B
D
E      D
F      B
求:根据部门去查找这个部门对应的目标部门,如果找不到,则找上一级部门对应的目标部门,循环直到找到目标部门。
最终实现效果如下:部门  目标部门
——————————
A    A
B    A
C    A
D    D
E    D
E    A

解决方案 »

  1.   

    with tab1 as (
    select 'a' target_id from dual union all
    select 'd' tar from dual
    )
    , tab2 as (
    select 'a' id, null parent_id from dual union all
    select 'b' id, 'a' parent_id from dual union all
    select 'c' id, 'b' parent_id from dual union all
    select 'd' id, null parent_id from dual union all
    select 'e' id, 'd' parent_id from dual union all
    select 'f' id, 'b' parent_id from dual 
    )
    , tab3 as (
    select connect_by_root(t1.id) id,
           case when t1.id in (select v1.target_id from tab1 v1) then t1.id else null end tar_
      from tab2 t1
    connect by prior t1.parent_id = t1.id
    and prior t1.id not in (select v1.target_id from tab1 v1)
    )
    select t1.id, max(t1.tar_) from tab3 t1 group by t1.id
    order by t1.id
    ;
      

  2.   


    哦哦,不好意思,可能我举的例子不够详细,这种写法是当所有的目标组织都是最顶层组织的时候。现在我面临的问题是,也可能是出现以下情况:
    已知:
    表1 
    ————————————————
    目标部门 范围部门
    A             B
    C             C
    E             E表2 
    ————————————————
    部门  上级部门

    B      A
    C      B

    E      D
    F      B
    求:根据部门去查找这个部门对应的目标部门,如果找不到,则找上一级部门对应的目标部门,循环直到找到目标部门。
    最终实现效果如下:部门  目标部门
    ——————————
    A    
    B       A
    C       C
    D    
    E        E
    F     能帮忙再看看吗?
      

  3.   


    哦哦,不好意思,可能我举的例子不够详细,这种写法是当所有的目标组织都是最顶层组织的时候。现在我面临的问题是,也可能是出现以下情况:
    已知:
    表1 
    ————————————————
    目标部门 范围部门
    A             B
    C             C
    E             E表2 
    ————————————————
    部门  上级部门

    B      A
    C      B

    E      D
    F      B
    求:根据部门去查找这个部门对应的目标部门,如果找不到,则找上一级部门对应的目标部门,循环直到找到目标部门。
    最终实现效果如下:部门  目标部门
    ——————————
    A    
    B       A
    C       C
    D    
    E        E
    F     能帮忙再看看吗?
    A的目标部门为什么不是A而是null?
      

  4.   

    那这个语句有问题?
    with tab1 as (
    select 'a' target_id from dual union all
    select 'c' target_id from dual union all
    select 'e' tar from dual
    )
    , tab2 as (
    select 'a' id, null parent_id from dual union all
    select 'b' id, 'a' parent_id from dual union all
    select 'c' id, 'b' parent_id from dual union all
    select 'd' id, null parent_id from dual union all
    select 'e' id, 'd' parent_id from dual union all
    select 'f' id, 'b' parent_id from dual 
    )
    , tab3 as (
    select connect_by_root(t1.id) id,
           case when t1.id in (select v1.target_id from tab1 v1) then t1.id else null end tar_
      from tab2 t1
    connect by prior t1.parent_id = t1.id
    and prior t1.id not in (select v1.target_id from tab1 v1)
    )
    select t1.id, max(t1.tar_) from tab3 t1 group by t1.id
    order by t1.id
    ;