delete from titles_test p where p.id in( select t.id from ( select *, row_number()over(partition by emp_no order by id) pson from titles_test ) as t where t.pson > 1 )
此题的 难点,就是要 理解 题干的要求:
(1)删除数据:对源数据进行删除 必须 使用 delete from 语句 delete from +表名
(2)emp_no重复的记录:这个无法直接查询出来的条件,而且重复的数据可能比较多,所以必须要用到 from表嵌套子查询。
(3)只保留最小的id:说明子查询中,要用到“排序窗口函数”(且要先分组‘按emp_no’分组,后排序 ‘按id进行’排序。)
(4)“排序窗口函数”具体用哪个? 考虑到重复的可能会比较多,所以需要进行 ‘连续非并列’排序。使用 row_number( )函数。
(5)思维要转换:因为是保留最小,所以就是要删除掉 队最小之外的其他, 即要把 非最小的行都查询出来。 所以后面的条件是
where t.pson > 1 查找出非最小的行 。 且在 最后 删除函数语句中, where p.id in(子查询) 把这些非最小的行 删除。