问题分析

我们需要删除 titles_test 表中 emp_no 重复的记录,但保留每个 emp_no 的最小 id 对应的记录。具体步骤如下:

  1. 找出每个 emp_no 的最小 id
  2. 删除那些 id 不是最小值的重复记录。

代码实现步骤

  1. 找出每个 emp_no 的最小 id

    SELECT MIN(id) AS min_id, emp_no FROM titles_test GROUP BY emp_no
    
    • 这个子查询用于找出每个 emp_no 的最小 id
    • GROUP BY emp_no 将数据按 emp_no 分组。
    • MIN(id) 找出每个分组中的最小 id
  2. 选出最小值之外的数据

    • 将原表 titles_test(别名为 t1)与子查询的结果(别名为 t2)进行连接。
    • ON t1.emp_no = t2.emp_no AND t1.id > t2.min_id
      • 确保只删除那些 id 大于最小 id 的记录。
  3. 删除那些 id 不是最小值的重复记录

    • DELETE t1 表示删除 t1(即原表 titles_test)中的记录。
    • 只有满足 JOIN 条件的记录会被删除。

完整代码


DELETE t1
FROM titles_test t1
JOIN (
    SELECT MIN(id) AS min_id, emp_no
    FROM titles_test
    GROUP BY emp_no
) t2
ON t1.emp_no = t2.emp_no AND t1.id > t2.min_id;