225 lines
7.3 KiB
SQL
225 lines
7.3 KiB
SQL
-- =============================================================================
|
||
-- 刷新 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;
|