sql 筛选屋无重复数据的一点注意

较广泛的筛选无重复数据的一种方法大概是如下格式

select * from table where column1 in (select min(column1) from student group by column2);

也就是一重复数据分组, 每组提出一个值(最大,最小或者其他),利用这个值去排除其他数据。思路是不错的,但是要注意的一点问题是这个值可能会受到其他组的影响,举例如下。

首先,完整表如下:

7001  	tian	74
7002  	zhang	74
7003  	yan	74
7004  	li	74
7005  	lia	73
7006  	liy	72
7007  	tian	75
7008  	tian	75
7009  	tian	76
7010  	tian	73
7011  	li	76
7012  	li	73



想选出无重复名字的数据。
select * from student where grade in (select min(grade) from student group by sname);
查询结果如下:
7001  	tian	74
7002  	zhang	74
7003  	yan	74
7004  	li	74
7005  	lia	73
7006  	liy	72
7010  	tian	73
7012  	li	73



发现名字还是有重复的, 因为虽然min(grade)在每个组只有一个,但是其他组的min(grade)未必与本组的相同,所以还是会有重复,这说明用来区别的列必须要唯一确定这条记录,所以采用主键才能保证唯一性。
select * from student where sno in (select min(sno) from student group by sname);

7001  	tian	74
7002  	zhang	74
7003  	yan	74
7004  	li	74
7005  	lia	73
7006  	liy	72




你可能感兴趣的:(sql 筛选屋无重复数据的一点注意)