2026-09-02-xg_student_msg-refresh-class-major-name.sql 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. -- =============================================================================
  2. -- 刷新 xg_student_msg 冗余字段:班级名称、专业名称
  3. --
  4. -- 背景:老师修改班级/专业后,xg_class_msg、sys_dept 已更新,
  5. -- 但 xg_student_msg 上冗余的 class_name、major_name 仍为旧值。
  6. --
  7. -- 刷新口径(与 vw_jw_student_export 一致):
  8. -- * class_name ← 关联班级 xg_class_msg.class_name(按 class_id)
  9. -- * major_name ← 优先学生 major_id → sys_dept.dept_name
  10. -- 其次班级 major_id → sys_dept.dept_name
  11. -- 再回退 xg_class_msg.major_name
  12. --
  13. -- 用法:
  14. -- mysql -h <host> -u root -p hzdyjs_xg < docs/数据库脚本/2026-09-02-xg_student_msg-refresh-class-major-name.sql
  15. --
  16. -- 建议:先执行「一、预览」确认影响范围,再执行「二、更新」
  17. -- =============================================================================
  18. SET NAMES utf8mb4;
  19. -- -----------------------------------------------------------------------------
  20. -- 一、预览:即将刷新的记录数
  21. -- -----------------------------------------------------------------------------
  22. SELECT '========== 1. 班级名称不一致(将刷新)==========' AS section;
  23. SELECT COUNT(*) AS need_refresh_class_name
  24. FROM xg_student_msg m
  25. INNER JOIN xg_class_msg cm
  26. ON cm.deleted = 0
  27. AND cm.tenant_id = m.tenant_id
  28. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  29. WHERE m.deleted = 0
  30. AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
  31. AND (
  32. m.class_name IS NULL
  33. OR TRIM(m.class_name) = ''
  34. OR m.class_name <> cm.class_name
  35. );
  36. SELECT '========== 2. 专业名称不一致(将刷新)==========' AS section;
  37. SELECT COUNT(*) AS need_refresh_major_name
  38. FROM xg_student_msg m
  39. LEFT JOIN xg_class_msg cm
  40. ON cm.deleted = 0
  41. AND cm.tenant_id = m.tenant_id
  42. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  43. LEFT JOIN sys_dept dm_m
  44. ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
  45. AND dm_m.del_flag = '0'
  46. AND dm_m.tenant_id = m.tenant_id
  47. LEFT JOIN sys_dept dm_cm
  48. ON dm_cm.dept_id = cm.major_id
  49. AND dm_cm.del_flag = '0'
  50. AND dm_cm.tenant_id = m.tenant_id
  51. WHERE m.deleted = 0
  52. AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
  53. AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
  54. AND (
  55. m.major_name IS NULL
  56. OR TRIM(m.major_name) = ''
  57. OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
  58. );
  59. SELECT '========== 3. 不一致样例(班级名称,最多 20 条)==========' AS section;
  60. SELECT
  61. m.id,
  62. m.student_no AS 学号,
  63. m.name AS 姓名,
  64. m.class_id,
  65. m.class_name AS 当前班级名称,
  66. cm.class_name AS 新班级名称
  67. FROM xg_student_msg m
  68. INNER JOIN xg_class_msg cm
  69. ON cm.deleted = 0
  70. AND cm.tenant_id = m.tenant_id
  71. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  72. WHERE m.deleted = 0
  73. AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
  74. AND (
  75. m.class_name IS NULL
  76. OR TRIM(m.class_name) = ''
  77. OR m.class_name <> cm.class_name
  78. )
  79. ORDER BY m.student_no
  80. LIMIT 20;
  81. SELECT '========== 4. 不一致样例(专业名称,最多 20 条)==========' AS section;
  82. SELECT
  83. m.id,
  84. m.student_no AS 学号,
  85. m.name AS 姓名,
  86. m.major_id,
  87. m.major_name AS 当前专业名称,
  88. COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) AS 新专业名称
  89. FROM xg_student_msg m
  90. LEFT JOIN xg_class_msg cm
  91. ON cm.deleted = 0
  92. AND cm.tenant_id = m.tenant_id
  93. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  94. LEFT JOIN sys_dept dm_m
  95. ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
  96. AND dm_m.del_flag = '0'
  97. AND dm_m.tenant_id = m.tenant_id
  98. LEFT JOIN sys_dept dm_cm
  99. ON dm_cm.dept_id = cm.major_id
  100. AND dm_cm.del_flag = '0'
  101. AND dm_cm.tenant_id = m.tenant_id
  102. WHERE m.deleted = 0
  103. AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
  104. AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
  105. AND (
  106. m.major_name IS NULL
  107. OR TRIM(m.major_name) = ''
  108. OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
  109. )
  110. ORDER BY m.student_no
  111. LIMIT 20;
  112. -- -----------------------------------------------------------------------------
  113. -- 二、执行更新(确认预览无误后再执行)
  114. -- -----------------------------------------------------------------------------
  115. START TRANSACTION;
  116. -- 2.1 刷新班级名称
  117. UPDATE xg_student_msg m
  118. INNER JOIN xg_class_msg cm
  119. ON cm.deleted = 0
  120. AND cm.tenant_id = m.tenant_id
  121. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  122. SET
  123. m.class_name = cm.class_name,
  124. m.update_time = NOW()
  125. WHERE m.deleted = 0
  126. AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
  127. AND (
  128. m.class_name IS NULL
  129. OR TRIM(m.class_name) = ''
  130. OR m.class_name <> cm.class_name
  131. );
  132. SELECT ROW_COUNT() AS updated_class_name_rows;
  133. -- 2.2 刷新专业名称
  134. UPDATE xg_student_msg m
  135. LEFT JOIN xg_class_msg cm
  136. ON cm.deleted = 0
  137. AND cm.tenant_id = m.tenant_id
  138. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  139. LEFT JOIN sys_dept dm_m
  140. ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
  141. AND dm_m.del_flag = '0'
  142. AND dm_m.tenant_id = m.tenant_id
  143. LEFT JOIN sys_dept dm_cm
  144. ON dm_cm.dept_id = cm.major_id
  145. AND dm_cm.del_flag = '0'
  146. AND dm_cm.tenant_id = m.tenant_id
  147. SET
  148. m.major_name = COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name),
  149. m.update_time = NOW()
  150. WHERE m.deleted = 0
  151. AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
  152. AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
  153. AND (
  154. m.major_name IS NULL
  155. OR TRIM(m.major_name) = ''
  156. OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
  157. );
  158. SELECT ROW_COUNT() AS updated_major_name_rows;
  159. -- 确认无误后提交;若要撤销请执行 ROLLBACK;
  160. COMMIT;
  161. -- -----------------------------------------------------------------------------
  162. -- 三、更新后复核
  163. -- -----------------------------------------------------------------------------
  164. SELECT '========== 5. 更新后仍不一致(应为 0 或接近 0)==========' AS section;
  165. SELECT
  166. (
  167. SELECT COUNT(*)
  168. FROM xg_student_msg m
  169. INNER JOIN xg_class_msg cm
  170. ON cm.deleted = 0
  171. AND cm.tenant_id = m.tenant_id
  172. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  173. WHERE m.deleted = 0
  174. AND NULLIF(TRIM(m.class_id), '') IS NOT NULL
  175. AND (
  176. m.class_name IS NULL
  177. OR TRIM(m.class_name) = ''
  178. OR m.class_name <> cm.class_name
  179. )
  180. ) AS remain_class_name_mismatch,
  181. (
  182. SELECT COUNT(*)
  183. FROM xg_student_msg m
  184. LEFT JOIN xg_class_msg cm
  185. ON cm.deleted = 0
  186. AND cm.tenant_id = m.tenant_id
  187. AND cm.id = CAST(NULLIF(TRIM(m.class_id), '') AS UNSIGNED)
  188. LEFT JOIN sys_dept dm_m
  189. ON dm_m.dept_id = CAST(NULLIF(TRIM(m.major_id), '') AS UNSIGNED)
  190. AND dm_m.del_flag = '0'
  191. AND dm_m.tenant_id = m.tenant_id
  192. LEFT JOIN sys_dept dm_cm
  193. ON dm_cm.dept_id = cm.major_id
  194. AND dm_cm.del_flag = '0'
  195. AND dm_cm.tenant_id = m.tenant_id
  196. WHERE m.deleted = 0
  197. AND COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name) IS NOT NULL
  198. AND TRIM(COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)) <> ''
  199. AND (
  200. m.major_name IS NULL
  201. OR TRIM(m.major_name) = ''
  202. OR m.major_name <> COALESCE(dm_m.dept_name, dm_cm.dept_name, cm.major_name)
  203. )
  204. ) AS remain_major_name_mismatch;