推薦使用函數
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,存在子查詢,性能可能出現問題。謹待道友支持