select * from Table1 t where 姓名 in(select top 5 姓名 from table1 where 学科=t.学科)--需要加排序時用order by 

解决方案 »

  1.   

    目前为止我所知道的好像1楼的是最好的方法了。
    如果数据量大,可以对学科和姓名分别建立索引。不过一楼的好像有一个逻辑错误,那就是如果允许一个人选择两个科目的话,将得不到正确的结果。因此建议:增加一列子增列:ID (可作为主键)
    对学科列进行排序
    语句:
    select * from tb a where id in (select top 5 id from tb where 学科=a.学科)
    order by 学科,性别
      

  2.   

    数据量很大的话即使加上索引也是很难解决效率的,因为学科再多也就100个,但是记录要是几百万的话效率就很低,表结构已经这样了,也不能拆表,现在就是想找一个效率好的SQL语句
      

  3.   

    如果有人可以选择一个以上的科目的话,你的要求只能用循环了。declare  @sql varchar(8000)
    select @sql = isnull(@sql+' union ','')
                +'select top 5 * from tb where  性别= ''男'' and 科目 ='''+科目+'' union '
                +'select top 5 * from tb where  性别= ''女'' and 科目 ='''+科目+'' '
    from tb group by 科目
    select @sql = 'select * from ('+@sql+') a order by 科目,性别'
    exec(@sql)
      

  4.   

    declare  @sql varchar(8000)
    select @sql = isnull(@sql+' union ','')
                +'select top 5 * from tb where  性别= ''男'' and 科目 ='''+科目+''' union '
                +'select top 5 * from tb where  性别= ''女'' and 科目 ='''+科目+''' '
    from tb group by 科目
    select @sql = 'select * from ('+@sql+') a order by 科目,性别'
    exec(@sql)