SQL批量修改部门的上级ID

1.部门表:T_SYS_DEPT

   部门表部分字段:

private String id;    
private String name;    // 部门名称
private String code;    // 部门编码
private String type;    // 1部门0机构
private String parentId;    // 上级ID,父级ID
private String levelCode;    // 层级CODE,例如00001,00001,00001

2.部门关系维护表:T_SYS_DEPT_TYPE
   部门关系维护表部分字段:

private String id;    // 主键ID
private String code;    // 部门关系编号
private String name;    // 部门关系名称
private String isParentFlag;    // 是否父级: 000-是,001-否

 3.部门关系所属机构或部门表实体表:T_SYS_DEPT_TYPE_RELATION

    字段:

private String id;    // 主键ID
private String deptTypeId;    // 部门关系ID
private String deptId;    // 机构或部门ID

场景:

   机构:【P0099/总部】,【P0100/上海分行】

   部门:除上述机构外,其余都是部门

   问题:根据部门关系维护表【T_SYS_DEPT_TYPE】中的数据,【C00990204/科技部】对应的上级部门是【C009902/金融科技部】,需要将上级部门数据修正

  解决方案:

1.查询出所有错误上级部门的部门信息

SELECT * FROM (
SELECT
	UP_B.CODE 父级部门CODE,
	UP_B.NAME 父级部门NAME,
	A.CODE 子级部门CODE,
	A.NAME 子级部门NAME,
	UP_DB.ID 上级部门ID,
	UP_DB.CODE 上级部门CODE,
	UP_DB.NAME 上级部门NAME,
	DA.ID 部门ID,
	DA.CODE 部门CODE,
	DA.NAME 部门NAME
FROM
	T_SYS_DEPT_TYPE_RELATION TR,  -- 部门关系所属机构或部门表实体表
	T_SYS_DEPT_TYPE A,    -- 部门关系维护表 子级部门
	T_SYS_DEPT_TYPE UP_B, -- 部门关系维护表 上级部门
	T_SYS_DEPT DA,   -- 部门表 子级部门
	T_SYS_DEPT UP_DB  -- 部门表 上级部门
WHERE
	TR.DEPT_TYPE_ID = A.ID
	AND A.IS_PARENT_FLAG = '001'
	AND TR.DEPT_ID = UP_B.ID
	AND DA.CODE = A.CODE 
	AND UP_DB.CODE != UP_B.CODE 
	AND DA."TYPE" = '1' 
	AND UP_DB."TYPE" = '1'
	AND DA.PARENT_ID = UP_DB.ID 
	GROUP BY  UP_B.CODE, UP_B.NAME, A.CODE, A.NAME, UP_DB.ID, 
	UP_DB.CODE, UP_DB.NAME, DA.ID, DA.CODE, DA.NAME
)

2.修改部门的层级code

--因为层级code很长,需要将对应错误的code替换掉
UPDATE T_SYS_DEPT U_DEPT SET U_DEPT.LEVEL_CODE =replace(U_DEPT.LEVEL_CODE, U_DEPT.PARENT_ID, (
		SELECT
			ORG_DEPT.ID
		FROM
			T_SYS_DEPT ORG,
			T_SYS_DEPT UP_DEPT,
			T_SYS_DEPT DEPT,
			T_SYS_DEPT ORG_DEPT,
			(SELECT
				UP_B.CODE UP_CODE,
				DA.CODE
			FROM
				T_SYS_DEPT_TYPE_RELATION TR,
				T_SYS_DEPT_TYPE A,
				T_SYS_DEPT_TYPE UP_B,
				T_SYS_DEPT DA,
				T_SYS_DEPT UP_DB
			WHERE
				TR.DEPT_TYPE_ID = A.ID
				AND A.IS_PARENT_FLAG = '001'
				AND TR.DEPT_ID = UP_B.ID
				AND DA.CODE = A.CODE 
				AND UP_DB.CODE != UP_B.CODE 
				AND DA."TYPE" = '1' 
				AND UP_DB."TYPE" = '1'
				AND DA.PARENT_ID = UP_DB.ID
				GROUP BY UP_B.CODE, DA.CODE) CORRECT_DEPT
		WHERE
			UP_DEPT."TYPE" = '1'
			AND UP_DEPT.PARENT_ID = ORG.ID
			AND ORG."TYPE" = '0'
			AND ORG.ID = ORG_DEPT.PARENT_ID 
			AND DEPT.PARENT_ID = UP_DEPT.ID
			AND DEPT.CODE = CORRECT_DEPT.CODE
			AND ORG_DEPT.CODE = CORRECT_DEPT.UP_CODE
			AND DEPT.ID = U_DEPT.ID
		))
WHERE EXISTS (SELECT
					1
				FROM
					T_SYS_DEPT_TYPE_RELATION TR,
					T_SYS_DEPT_TYPE A,
					T_SYS_DEPT_TYPE UP_B,
					T_SYS_DEPT DA,
					T_SYS_DEPT UP_DB
				WHERE
					TR.DEPT_TYPE_ID = A.ID
					AND A.IS_PARENT_FLAG = '001'
					AND TR.DEPT_ID = UP_B.ID
					AND DA.CODE = A.CODE 
					AND UP_DB.CODE != UP_B.CODE 
					AND DA."TYPE" = '1' 
					AND UP_DB."TYPE" = '1'
					AND DA.PARENT_ID = UP_DB.ID 
					AND DA.ID = U_DEPT.ID 
					)
--AND U_DEPT.CODE = 'C00990204'

3.修改部门的上级部门【PARENT_ID 】

UPDATE T_SYS_DEPT U_DEPT SET U_DEPT.PARENT_ID = (
		SELECT
			ORG_DEPT.ID
		FROM
			T_SYS_DEPT ORG,
			T_SYS_DEPT UP_DEPT,
			T_SYS_DEPT DEPT,
			T_SYS_DEPT ORG_DEPT,
			(SELECT
				UP_B.CODE UP_CODE,
				DA.CODE
			FROM
				T_SYS_DEPT_TYPE_RELATION TR,
				T_SYS_DEPT_TYPE A,
				T_SYS_DEPT_TYPE UP_B,
				T_SYS_DEPT DA,
				T_SYS_DEPT UP_DB
			WHERE
				TR.DEPT_TYPE_ID = A.ID
				AND A.IS_PARENT_FLAG = '001'
				AND TR.DEPT_ID = UP_B.ID
				AND DA.CODE = A.CODE 
				AND UP_DB.CODE != UP_B.CODE 
				AND DA."TYPE" = '1' 
				AND UP_DB."TYPE" = '1'
				AND DA.PARENT_ID = UP_DB.ID
				GROUP BY UP_B.CODE, DA.CODE) CORRECT_DEPT
		WHERE
			UP_DEPT."TYPE" = '1'
			AND UP_DEPT.PARENT_ID = ORG.ID
			AND ORG."TYPE" = '0'
			AND ORG.ID = ORG_DEPT.PARENT_ID 
			AND DEPT.PARENT_ID = UP_DEPT.ID
			AND DEPT.CODE = CORRECT_DEPT.CODE
			AND ORG_DEPT.CODE = CORRECT_DEPT.UP_CODE
			AND DEPT.ID = U_DEPT.ID
		)
WHERE EXISTS (SELECT
				1
			FROM
				T_SYS_DEPT_TYPE_RELATION TR,
				T_SYS_DEPT_TYPE A,
				T_SYS_DEPT_TYPE UP_B,
				T_SYS_DEPT DA,
				T_SYS_DEPT UP_DB
			WHERE
				TR.DEPT_TYPE_ID = A.ID
				AND A.IS_PARENT_FLAG = '001'
				AND TR.DEPT_ID = UP_B.ID
				AND DA.CODE = A.CODE 
				AND UP_DB.CODE != UP_B.CODE 
				AND DA."TYPE" = '1' 
				AND UP_DB."TYPE" = '1'
				AND DA.PARENT_ID = UP_DB.ID 
				AND DA.ID = U_DEPT.ID 
				)
--AND U_DEPT.CODE = 'C00990204'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值