推荐使用函数
row_number() over(partition by k.f_id order by 1 desc) rn //这里的partition by 后面是想要去重的字段 //order by 必须要有,可以order by 常量用来提高性能 默认asc //rn 是别名
学号 | 姓名 | 成绩 | 性别 | 年龄 |
1 | 张三 | 97 | male | 27 |
2 | 李四 | 98 | male | 28 |
3 | 王二 | 97 | male | 29 |
4 | 麻子 | 91 | male | 30 |
如上表:上表数据是由学生表和成绩表联合查出来的一张虚表,此时需求为省去成绩重复的学生(无论省去谁都可以)。实际开发中经常碰到这样的需求
select s.id,s.name,g.grade,s.sex,s.age from student s left join gradetion g on s.id = g.stuId
上面sql是原始sql
select a.id, a.name, a.grade, a.sex, a.age from (select s.id, s.name, g.grade, s.sex, s.age, rownum() over(partition by g.grade order by 1) rn from student s left join gradetion g on s.id = g.stuId) a where a.rn = 1
经过优化的sql,存在子查询,性能可能出现问题。谨待道友支持