dede织梦网站,金山手机网站建设,公众号怎么链接wordpress,合肥做网页的网络公司现有需求如下#xff0c;业务组织单元表中id字段数据在另外一个系统全部重复#xff0c;但需要将此业务单元组织导入另一系统
业务组织单元表Isc_Specialorg_Unit 表中存在ID字段为子节点数据#xff0c;parent_id为父节点数据#xff0c;orgpath为组织路径
现在做如下操…
现有需求如下业务组织单元表中id字段数据在另外一个系统全部重复但需要将此业务单元组织导入另一系统
业务组织单元表Isc_Specialorg_Unit 表中存在ID字段为子节点数据parent_id为父节点数据orgpath为组织路径
现在做如下操作
1.创建临时表
create table test as select * from Isc_Specialorg_Unit t
2.在test表中增加三列id1parent_id1,orgpath1
alter table test add (id1 varchar(32));
alter table test add (parent_id1 varchar(32));
alter table test add (or1 varchar(32));
3.更新id1列为随机数据
update test set id1SYS_GUID()
4.根据表test在创建临时表test1
create table test1 as select * from test tselect create table test1 as select || wm_concat(column_name) || from test sqlStr from user_tab_columns where table_nametest;
5.根据id列parent_id列id1更新parent_id1列的值为id1的值
merge into test k
using (select a.id1,a.id from test1 a) kk
on (k.parent_idkk.id)
when matched then update set k.parent_id1kk.id1
6.将test中id列和parent_id列删掉
alter table test drop column id;
alter table test drop column parent_id;
7.修改id1为idpranent_id1为parent_id,获取组织路径并创建表test3
create table test3 as
select distinct a.id ,sys_connect_by_path(id,/) orgpath from test a start with a.id1connect by prior a.ida.parent_id
7.根据test3表将组织路径保存至test的orgpath中
merge into test b
using
(
select a.id,a.orgpath from test3 a
) kk
on (b.idkk.id)
when matched then update set b.orgpathkk.orgpath
8.导出表test为sql文件删掉表 drop test;drop test1;drop test3导入另一系统数据库 备注 select ... from TableName where Conditional-1 start with Conditional-2 connect by Conditional-3 connect by中的条件就表示了父子之间的连接关系比如 connect by idprior pid LEVEL伪列表示树的深度或叫高度 其中 connect by 与 start with 语句摆放的先后顺序不影响查询的结果[where 条件1]可以不需要若是出现则要放在 connect by 与 start with 语句之前否则出错 [where 条件1]、[条件2]、[条件3]各自作用的范围都不相同 [where 条件1] 是在根据“connect by [条件2] start with [条件3]”选择出来的记录中进行过滤是针对单条记录的过滤 不会考虑树的结构最后的过滤 [ connect by 条件2] 指定构造树的条件以及对树分支的过滤条件在这里执行的过滤会把符合条件的记录及其下的所有子节点都过滤掉 [ start with 条件3] 限定作为搜索起始点的条件如果是自上而下的搜索则是限定作为根节点的条件如果是自下而上的搜索则是限定作为叶子节点的条件 要根据connect by 从上到下还是从下到上来确定起始节点可能是叶节点也可能是父节点这些开始节点可以是多个并且包含这些节点。 层级查询语句hierarchical query中where子句先被执行再执行CONNECT BY子句以及其附属子句 1、这里说的节点指的是层级查询语句hierarchical query中from子句里的表的每一数据行。 2、层级查询语句hierarchical query中CONNECT BY子句是必选的而START WITH子句是可选的START WITH子句是用来修饰CONNECT BY子句的若该子句被省略则表示所有满足查询条件即where子句里的条件的行作为根节点 3、prior关键字放在CONNECT BY子句中。其中用PRIOR表示上一条记录比如 CONNECT BY PRIOR id parent_id就是说上一条记录的id 是本条记录的parent_id即本记录的父亲是上一条记录prior放在connect by子句连接条件里的哪一边哪一边就是父节点的编号值的来源而connect by子句连接条件里等号另一边就是记录一数据行其对应的父节点的编号值 START WITH 子句和CONNECT BY子句是两个相互独立的子句即并没有规定START WITH 子句出现的列就是要为CONNECT BY子句里那个带有关键字prior的列START WITH 子句出现的列可以来自表里的任何列也就是说START WITH 子句出现的列可以没有在START WITH 子句里出现因为START WITH 子句的作用就是根据START WITH 子句的限定条件来筛选出哪些数据行作为根节点而已 start with子句不是一个独立的子句即start with子句是一个不能单独出现在SQL语句的子句必须在SQL语句中出现了connect by子句后才能出现 当connect by子句的条件里出现的字段是普通字段不是伪列字段rownum或是level时connect by子句的条件里的表达式必须要有prior运算符 放在一个字段的前面当connect by子句的条件里出现的是伪列字段rownum或是level时connect by子句的条件里的表达式不用出现prior运算符