日期:2014-05-18  浏览次数:20518 次

请教关于单个表查询, 对于某条件重复的数据,只提取随机一条的问题.(简单的SQL查询语句)
有这么一个表: 
tblStud(fId, fName, fAge, fClass) 说明:fId是主键,唯一编号,fName有可能重复,fAge, fClass只是表的一些其它信息.
由于fName 可能重复, 因此,我想得到这样一个表,四个字段都有,但姓名不重复, 对于姓名重复的记录,只取任意一条就可以了. 示例数据如下:
fId fName fAge fClass
1 李军 21 大二
2 张红 21 大三
3 张三 20 大一
4 李军 22 大三
5 王五 20 大三
6 张红 22 大三

需要得到的数据如下:

fId fName fAge fClass
1 李军 21 大二
2 张红 21 大三
3 张三 20 大一
5 王五 20 大三

"4"和"6"已经重复,因此不要.

自己的想法是:应该对fName 进行分组查询,可是用分组语句,只能得到"fName"这一列,其它的三个值没法得到,
试着用"top 1"也不行. 
后来想着用: select * from tblStud where fId in( select fId from tblStud group by fName ) 呵呵,这条语句明显有问题,却不知道怎样解决.. 
想着用distinct 仍然不行..不知各位是怎样解决的? 最好能说说你们都是怎样分析的..




------解决方案--------------------
use aggregate function,

select * from tblSud Where fId in (select min(fId) from tblStud group by fName)
------解决方案--------------------
SQL code
--任意选一条
select * from tblStud a where fId=(select top 1 fId from tblStud where fName=a.fName order by newid())
--取最大或最小
select * from tblStud a where fId=(select min/*max*/(fId) from tblStud where fName=a.fName)

------解决方案--------------------
select fID, fName, fAge, fClass
from tblStud
where fID = (select top 1 fID
from tblStud
where fName = A.fName)
------解决方案--------------------
SQL code
--按某一字段分组取最大(小)值所在行的数据
--2007-10-23于杭州
/*
数据如下:
name val memo
a    2   a2(a的第二个值)
a    1   a1--a的第一个值
a    3   a3:a的第三个值
b    1   b1--b的第一个值
b    3   b3:b的第三个值
b    2   b2b2b2b2
b    4   b4b4
b    5   b5b5b5b5b5
*/
--创建表并插入数据:
create table tb(name varchar(10),val int,memo varchar(20))
insert into tb values('a',    2,   'a2(a的第二个值)')