##角色查询和更新 UPDATE t_role_employee re SET role_id = 35 WHERE EXISTS ( SELECT 1 FROM t_institutions_punish ti LEFT JOIN t_department td ON ti.name = td.department_name COLLATE utf8mb4_0900_ai_ci LEFT JOIN t_employee te ON ti.principal = te.actual_name COLLATE utf8mb4_0900_ai_ci AND td.department_id = te.department_id WHERE ti.principal IS NOT NULL AND te.employee_id IS NOT NULL AND te.employee_id = re.employee_id ); 启动脚本 nohup java -server -Xms1024m -Xmx1024m -jar yun-admin-prod-3.0.0.jar > yun-admin-nohup.out 2>&1 & 查询新增律师数据: SELECT a.*,t.department_id FROM t_lawyers_punish_20261 a LEFT JOIN t_department t ON a.practice_institution = t.department_name WHERE a.user_id NOT IN( SELECT CONVERT(login_name USING utf8mb4) COLLATE utf8mb4_unicode_ci FROM t_employee ) 如果departmentId有空的可能是新增的机构 第二个sql SELECT a.user_id as login_name, a.full_name as actual_name, a.mobile_phone as phone, a.practice_certificate_no as certificate_number, CASE WHEN a.gender = '男' THEN 1 WHEN a.gender = '女' THEN 2 ELSE NULL END as gender, t.department_id as department_id FROM t_lawyers_punish_20261 a LEFT JOIN t_department t ON a.practice_institution = t.department_name WHERE a.user_id NOT IN( SELECT CONVERT(login_name USING utf8mb4) COLLATE utf8mb4_unicode_ci FROM t_employee ) AND t.department_id IS NOT NULL 给新增的人员复制律师权限 SELECT employee_id, 35 as role_id from t_employee where employee_id not in (select employee_id from t_role_employee) 查询有没有变更机构的 -- 获取每个 user_id 的最新一条处罚记录(按 id 降序取第一条) WITH latest_punish AS ( SELECT lp.user_id, lp.practice_institution FROM ( SELECT user_id, practice_institution, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY id DESC) AS rn FROM t_lawyers_punish ) lp WHERE lp.rn = 1 ), -- 当前员工机构信息 current_employee AS ( SELECT a.login_name, t.department_name AS current_institution, t.department_id -- 如果需要直接更新部门ID,保留此字段 FROM t_employee a LEFT JOIN t_department t ON a.department_id = t.department_id ) -- 找出需要更新的记录 SELECT lp.user_id AS identifier, lp.practice_institution AS original_institution, ce.current_institution, ce.department_id AS current_department_id, -- 尝试匹配部门名称到 department_id(如果 practice_institution 与 t_department.name 一致) (SELECT department_id FROM t_department WHERE department_name = lp.practice_institution COLLATE utf8mb4_unicode_ci LIMIT 1) AS target_department_id, CASE WHEN ce.login_name IS NULL THEN '员工不存在于当前系统' WHEN lp.practice_institution IS NULL THEN '原始机构为空' WHEN lp.practice_institution != ce.current_institution OR (ce.current_institution IS NULL AND lp.practice_institution IS NOT NULL) THEN '机构不一致' ELSE '一致' END AS update_needed FROM latest_punish lp LEFT JOIN current_employee ce ON lp.user_id COLLATE utf8mb4_unicode_ci = ce.login_name WHERE -- 只筛选出需要更新的情况:员工存在且机构不一致 ce.login_name IS NOT NULL AND (lp.practice_institution != ce.current_institution OR (ce.current_institution IS NULL AND lp.practice_institution IS NOT NULL)); 进行更新 UPDATE t_employee e JOIN ( WITH latest_punish AS ( -- 取每个user_id的最新一条处罚记录(按id倒序取第一条,若用日期字段请调整ORDER BY) SELECT lp.user_id COLLATE utf8mb4_unicode_ci AS user_id, lp.practice_institution COLLATE utf8mb4_unicode_ci AS practice_institution FROM ( SELECT user_id, practice_institution, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY id DESC) AS rn FROM t_lawyers_punish ) lp WHERE lp.rn = 1 ), current_employee AS ( -- 当前员工机构信息,统一转为utf8mb4_unicode_ci SELECT a.login_name COLLATE utf8mb4_unicode_ci AS login_name, t.department_name COLLATE utf8mb4_unicode_ci AS current_institution, t.department_id FROM t_employee a LEFT JOIN t_department t ON a.department_id = t.department_id ) SELECT lp.user_id AS identifier, -- 已统一collation lp.practice_institution AS original_institution, ce.current_institution, ce.department_id AS current_department_id, -- 尝试将原始机构名称匹配到部门表,获取目标department_id (SELECT department_id FROM t_department WHERE department_name COLLATE utf8mb4_unicode_ci = lp.practice_institution LIMIT 1) AS target_department_id, CASE WHEN ce.login_name IS NULL THEN '员工不存在于当前系统' WHEN lp.practice_institution IS NULL THEN '原始机构为空' WHEN lp.practice_institution != ce.current_institution OR (ce.current_institution IS NULL AND lp.practice_institution IS NOT NULL) THEN '机构不一致' ELSE '一致' END AS update_needed FROM latest_punish lp LEFT JOIN current_employee ce ON lp.user_id = ce.login_name -- 两边collation已统一 WHERE ce.login_name IS NOT NULL AND (lp.practice_institution != ce.current_institution OR (ce.current_institution IS NULL AND lp.practice_institution IS NOT NULL)) ) tmp ON e.login_name COLLATE utf8mb4_unicode_ci = tmp.identifier -- 转换e.login_name以匹配 SET e.department_id = tmp.target_department_id WHERE tmp.target_department_id IS NOT NULL; -----内勤角色----- SELECT DISTINCT a.position_name as login_name,a.name as actual_name,a.phone as phone, 1 as certificate_number, 1 as gender, t.department_id as department_id FROM t_employee_import a LEFT JOIN t_department t ON a.law_firm = t.department_name WHERE a.position_name NOT IN( SELECT CONVERT(login_name USING utf8mb4) COLLATE utf8mb4_unicode_ci FROM t_employee ) SELECT employee_id, 40 as role_id from t_employee where employee_id not in (select employee_id from t_role_employee)