distinct的作用是对查询结果进行去重,防止出现重复数据;
ROW_NUMBER()函数是对查询出的结果添加一列不重复的数字;
结果就导致两者共用时因为ROW_NUMBER()这一行不会重复,所以distinct相当于没用了;
举例:
用的表结构
一个普通的SQL查询
select name,age,class,score from student where age = 10;
结果:
只添加distinct查询:
select distinct name,age,class,score from student where age = 10;
结果:
可以看到对于重复的数据已经去除掉了
只使用ROW_NUMBER()函数
select ROW_NUMBER() OVER(),name,age,class,score from student where age = 10;
结果:
结果添加了新的一列,并且值不重复
ROW_NUMBER()和distinct一起用
select distinct ROW_NUMBER() OVER(),name,age,class,score from student where age = 10;
结果:
可以看到姓名为张三的数据本来应该被distinct给去重掉,但是因为ROW_NUMBER()函数新增加的那一列导致数据不重复了,所以去重失败!
解决办法
对于ROW_NUMBER()和distinct必须要同时使用的情况,这里提供一个解决办法,将ROW_NUMBER()函数和distinct使用子查询的形式来分开;
举例:
sql改造-
select t.*,ROW_NUMBER() OVER() from
(select distinct name,age,class,score from student where age = 10) t;
结果:
可以看到结果又经过了去重,又添加了排行列;
使用子查询先将数据查出来并且进行去重操作,然后将去重后的结果添加ROW_NUMBER()函数添加排行列,实测可用!