求论坛大佬帮忙看看以下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
————————————————
目标部门 范围部门
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
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
;
哦哦,不好意思,可能我举的例子不够详细,这种写法是当所有的目标组织都是最顶层组织的时候。现在我面临的问题是,也可能是出现以下情况:
已知:
表1
————————————————
目标部门 范围部门
A B
C C
E E表2
————————————————
部门 上级部门
A
B A
C B
D
E D
F B
求:根据部门去查找这个部门对应的目标部门,如果找不到,则找上一级部门对应的目标部门,循环直到找到目标部门。
最终实现效果如下:部门 目标部门
——————————
A
B A
C C
D
E E
F 能帮忙再看看吗?
哦哦,不好意思,可能我举的例子不够详细,这种写法是当所有的目标组织都是最顶层组织的时候。现在我面临的问题是,也可能是出现以下情况:
已知:
表1
————————————————
目标部门 范围部门
A B
C C
E E表2
————————————————
部门 上级部门
A
B A
C B
D
E D
F B
求:根据部门去查找这个部门对应的目标部门,如果找不到,则找上一级部门对应的目标部门,循环直到找到目标部门。
最终实现效果如下:部门 目标部门
——————————
A
B A
C C
D
E E
F 能帮忙再看看吗?
A的目标部门为什么不是A而是null?
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
;