| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- -- =============================================================================
- -- 刷新 xg_student_msg 冗余字段:班级名称、专业名称
- --
- -- 背景:老师修改班级/专业后,xg_class_msg、sys_dept 已更新,
- -- 但 xg_student_msg 上冗余的 class_name、major_name 仍为旧值。
- --
- -- 刷新口径(与 vw_jw_student_export 一致):
- -- * class_name ← 关联班级 xg_class_msg.class_name(按 class_id)
- -- * major_name ← 优先学生 major_id → sys_dept.dept_name
- -- 其次班级 major_id → sys_dept.dept_name
- -- 再回退 xg_class_msg.major_name
- --
- -- 用法:
- -- mysql -h <host> -u root -p hzdyjs_xg < docs/数据库脚本/2026-09-02-xg_student_msg-refresh-class-major-name.sql
- --
- -- 建议:先执行「一、预览」确认影响范围,再执行「二、更新」
- -- =============================================================================
- SET NAMES utf8mb4;
- -- -----------------------------------------------------------------------------
- -- 一、预览:即将刷新的记录数
- -- -----------------------------------------------------------------------------
- SELECT '========== 1. 班级名称不一致(将刷新)==========' AS section;
- SELECT COUNT(*) AS need_refresh_class_name
- FROM xg_student_msg m
- INNER JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- WHERE m.deleted = 0
- AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
- AND (
- m.class_name IS NULL
- OR TRIM(m.class_name) = ''
- OR m.class_name <> cm.class_name
- );
- SELECT '========== 2. 专业名称不一致(将刷新)==========' AS section;
- SELECT COUNT(*) AS need_refresh_major_name
- FROM xg_student_msg m
- LEFT JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- LEFT JOIN sys_dept dm_m
- ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
- AND dm_m.del_flag = '0'
- AND dm_m.tenant_id = m.tenant_id
- LEFT JOIN sys_dept dm_cm
- ON dm_cm.dept_id = cm.major_id
- AND dm_cm.del_flag = '0'
- AND dm_cm.tenant_id = m.tenant_id
- WHERE m.deleted = 0
- AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
- AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
- AND (
- m.major_name IS NULL
- OR TRIM(m.major_name) = ''
- OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
- );
- SELECT '========== 3. 不一致样例(班级名称,最多 20 条)==========' AS section;
- SELECT
- m.id,
- m.student_no AS 学号,
- m.name AS 姓名,
- m.class_id,
- m.class_name AS 当前班级名称,
- cm.class_name AS 新班级名称
- FROM xg_student_msg m
- INNER JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- WHERE m.deleted = 0
- AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
- AND (
- m.class_name IS NULL
- OR TRIM(m.class_name) = ''
- OR m.class_name <> cm.class_name
- )
- ORDER BY m.student_no
- LIMIT 20;
- SELECT '========== 4. 不一致样例(专业名称,最多 20 条)==========' AS section;
- SELECT
- m.id,
- m.student_no AS 学号,
- m.name AS 姓名,
- m.major_id,
- m.major_name AS 当前专业名称,
- COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) AS 新专业名称
- FROM xg_student_msg m
- LEFT JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- LEFT JOIN sys_dept dm_m
- ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
- AND dm_m.del_flag = '0'
- AND dm_m.tenant_id = m.tenant_id
- LEFT JOIN sys_dept dm_cm
- ON dm_cm.dept_id = cm.major_id
- AND dm_cm.del_flag = '0'
- AND dm_cm.tenant_id = m.tenant_id
- WHERE m.deleted = 0
- AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
- AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
- AND (
- m.major_name IS NULL
- OR TRIM(m.major_name) = ''
- OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
- )
- ORDER BY m.student_no
- LIMIT 20;
- -- -----------------------------------------------------------------------------
- -- 二、执行更新(确认预览无误后再执行)
- -- -----------------------------------------------------------------------------
- START TRANSACTION;
- -- 2.1 刷新班级名称
- UPDATE xg_student_msg m
- INNER JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- SET
- m.class_name = cm.class_name,
- m.update_time = NOW()
- WHERE m.deleted = 0
- AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
- AND (
- m.class_name IS NULL
- OR TRIM(m.class_name) = ''
- OR m.class_name <> cm.class_name
- );
- SELECT ROW_COUNT() AS updated_class_name_rows;
- -- 2.2 刷新专业名称
- UPDATE xg_student_msg m
- LEFT JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- LEFT JOIN sys_dept dm_m
- ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
- AND dm_m.del_flag = '0'
- AND dm_m.tenant_id = m.tenant_id
- LEFT JOIN sys_dept dm_cm
- ON dm_cm.dept_id = cm.major_id
- AND dm_cm.del_flag = '0'
- AND dm_cm.tenant_id = m.tenant_id
- SET
- m.major_name = COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name),
- m.update_time = NOW()
- WHERE m.deleted = 0
- AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
- AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
- AND (
- m.major_name IS NULL
- OR TRIM(m.major_name) = ''
- OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
- );
- SELECT ROW_COUNT() AS updated_major_name_rows;
- -- 确认无误后提交;若要撤销请执行 ROLLBACK;
- COMMIT;
- -- -----------------------------------------------------------------------------
- -- 三、更新后复核
- -- -----------------------------------------------------------------------------
- SELECT '========== 5. 更新后仍不一致(应为 0 或接近 0)==========' AS section;
- SELECT
- (
- SELECT COUNT(*)
- FROM xg_student_msg m
- INNER JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- WHERE m.deleted = 0
- AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
- AND (
- m.class_name IS NULL
- OR TRIM(m.class_name) = ''
- OR m.class_name <> cm.class_name
- )
- ) AS remain_class_name_mismatch,
- (
- SELECT COUNT(*)
- FROM xg_student_msg m
- LEFT JOIN xg_class_msg cm
- ON cm.deleted = 0
- AND cm.tenant_id = m.tenant_id
- AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
- LEFT JOIN sys_dept dm_m
- ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
- AND dm_m.del_flag = '0'
- AND dm_m.tenant_id = m.tenant_id
- LEFT JOIN sys_dept dm_cm
- ON dm_cm.dept_id = cm.major_id
- AND dm_cm.del_flag = '0'
- AND dm_cm.tenant_id = m.tenant_id
- WHERE m.deleted = 0
- AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
- AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
- AND (
- m.major_name IS NULL
- OR TRIM(m.major_name) = ''
- OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
- )
- ) AS remain_major_name_mismatch;
|