现在有一张部门关系表com_info,其中字段为com_code,up_com_code。就是存放部门以及其直属上级部门关系。比如有这么几条记录:
com_code up_com_code
860101 8601
8601 86
86现在我想每个部门与其所有上级部门都建立对应关系,存入到另外一张同构表com_info_rela中,本表中增加direct_flag字段,0表示间接关系,1表示直接关系,2表示本身。希望最后的得到的结果为:
com_code up_com_code direct_flag
860101 860101 2
860101 8601 1
860101 86 0
8601 8601 2
8601 86 1
86 86 2我目前是分三步走,
1。首先将所有部门与其直属上级对应关系导入到com_info_rela中。
2。然后用connect by这个递归语句将其间接关系插入。
3。最后再将其与本身的对应关系插入。
注:第3步必须在第2步之后,否则第2步报错。
我现在希望能通过一条select语句来实现转换,请问能否实现?谢谢!
com_code up_com_code
860101 8601
8601 86
86现在我想每个部门与其所有上级部门都建立对应关系,存入到另外一张同构表com_info_rela中,本表中增加direct_flag字段,0表示间接关系,1表示直接关系,2表示本身。希望最后的得到的结果为:
com_code up_com_code direct_flag
860101 860101 2
860101 8601 1
860101 86 0
8601 8601 2
8601 86 1
86 86 2我目前是分三步走,
1。首先将所有部门与其直属上级对应关系导入到com_info_rela中。
2。然后用connect by这个递归语句将其间接关系插入。
3。最后再将其与本身的对应关系插入。
注:第3步必须在第2步之后,否则第2步报错。
我现在希望能通过一条select语句来实现转换,请问能否实现?谢谢!
UPDATE tt SET direct_flag=decode(length(com_code)-length(up_com_code),0,2,2,1,0);
select com_code,up_com_code,num1+2*num2 direct_flag
(select a.com_code com_code,b.com_code up_com_code,
(select count(*) from com_info where com_code=a.com_code and up_com_code=b.com_code) num1,
(select count(*) from com_info where com_code=a.com_code and up_com_code=com_code) num2
from com_info a,com_info b
where a.com_code in (select com_code from com_info connect by com_code=up_com_code start whith up_com_code=b.com_code)
or a.com_code=b.com_code)
就你目前的这个编码方法来说(级别关系是2位数)
SELECT * FROM tt;
860101 860101
860101 8601
860101 86
8601 8601
8601 86
86 86
--创建你要的新表tttt
CREATE TABLE tttt AS
SELECT com_code,up_com_code,decode(length(com_code)-length(up_com_code),0,2,2,1,0)
direct_flag FROM tt;
SELECT * FROM tttt;
860101 860101 2
860101 8601 1
860101 86 0
8601 8601 2
8601 86 1
86 86 2
2 table_temp as(
3 select com_code,level j
4 from com_info
5 start with up_com_code is null
6 connect by up_com_code = prior com_code)
7 select
8 t1.com_code com_code,
9 t2.com_code up_com_code,
10 t2.j-t1.j+2 direct_flag
11 from table_temp t1
12 join table_temp t2
13 on (t1.j>=t2.j);COM_CODE UP_COM_CODE DIRECT_FLAG
-------- ----------- -----------
860101 860101 2
860101 8601 1
860101 86 0
8601 8601 2
8601 86 1
86 86 26 rows selectedSQL>