oracle 树形结构经常要通过parent_id生成parent_ids(当前节点路径)
//根据parent_id生成parent_ids
update sys_office
set
parent_ids = (
SELECT parent_ids from
(
SELECT tt.id, TRIM(LEADING ',' FROM SYS_CONNECT_BY_PATH(tt.id, ',')) as parent_ids from SYS_OFFICE tt
START WITH tt.parent_id='0'
CONNECT BY PRIOR tt.id = tt.parent_id
) t
where t.id = sys_office.id
);
在实际项目中数据量大时可能出现执行慢的情况,就分开处理,先生成一张中间表,再更新组织机构表。我在实际项目中遇到的情况是处理4w多条数据,不生成中间表执行了20分钟还没完成,于是停止执行,创建中间表,再更新,几分钟搞定。
//根据parent_id生成parent_ids,数据量大的时候创建中间表
create table t_test as( SELECT id,parent_ids from
(
SELECT tt.id, TRIM(LEADING ',' FROM SYS_CONNECT_BY_PATH(tt.id, ',')) as parent_ids from SYS_OFFICE tt
START WITH tt.parent_id='0'
CONNECT BY PRIOR tt.id = tt.parent_id
) t )
//更新组织表
update sys_office o set o.parent_ids = (select t.parent_ids from t_test t where o.id=t.id)