SELECT TOP 2 * 
FROM t 
WHERE field1 = 'a'
ORDER BY newid()

解决方案 »

  1.   

    SELECT TOP 2 *
    ,(SELECT COUNT(*) FROM t WHERE field1 = 'a') Num
    FROM t 
    WHERE field1 = 'a'
    ORDER BY newid()
      

  2.   

    楼上两位可能还没有理解我说的吧,可能我没说清楚
    我要列出的不只是field1='a'的随便两条
    而是field1中所有不同字段的都要列出两条
      

  3.   

    随机的话。。不行。因为一随机,就是要求对每条纪录进行随机筛选,但是有要控制一类别总纪录数就必须进行一个聚合的count操作,要聚合只能用比较视图进行聚合,对于完全随机的方式下,根本没办法构造合适的稳定视图,因此无法实现计数筛选,只能靠循环实现。不随机取几条倒简单。
      

  4.   

    为了让大家能理解,我再补充一点,
    按table表,最后希望列出的是:
    id       field1     field2      field3  .....
    2        a           as            sss
    3        a           df            ddd
    4        b           asdf          aaa
    7        b           ddd           sss
    5        c           bbb           ddd
    6        d           sss           sss
    8        d           dds           aaa
    不知道这样行不行了,
      

  5.   

    不行,除非随机视图可重用,但是这在SQL Server 里不使用临时表是做不到的。
    我的随机视图意思是说
    SELECT TOP 2 * 
    FROM t 
    ORDER BY newid() 
    结果不可重复
      

  6.   

    不行,除非随机视图可重用,但是这在SQL Server 里不使用临时表是做不到的。
    我的随机视图意思是说
    SELECT *,newid() new_Row_Reamrk
    FROM t 
    结果不可重复
      

  7.   

    那如果不要随机,就是找出field1相同字段内的两条记录呢,
    楼上的请再指教一下,
      

  8.   

    select *  from table t1
    where (select count(*)  from table t2 where t1.field1=t2.field1 and t1.id<=t2.id) <2
      

  9.   

    select * from t
     where field1 in ( select field1 from t group by field1 having (count(field1)>1) )
      

  10.   

    select * from
     ( 
    select rownum num, * from t
     where field1 in ( select field1 from t group by field1 having (count(field1)=1) )
    )
    unionselect * from
     ( 
    select rownum num, * from t
     where field1 in ( select field1 from t group by field1 having (count(field1)>1) )
    )
    where mod(num,2) =0  //商为0
      

  11.   

    这么查应该是最快的select * from 结果表
      

  12.   

    用一句话来解决吧
    select TOP 2 max(id) as id,max(field1) as field1,max(field2) as field2,max(field3) as field3 FROM t where field1='查寻值' group by field1 
    这样会比较快哦。
      

  13.   

    可以用游标吗?
    下面是个用游标的例子/* ***************************************************************
    ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    在authors中,根据state字段,在相同的state字段中随机取出一条记录。这个也用到了游标
    思路:
    把所有的state字段提取到一个游标state_cursor 中,
    再在游标中扫描,没扫描一个字段,就根据当前关键字把authors表中state字段等于当前字段的记录提取到一个游标state_1_cursor 中,
    再在游标state_1_cursor 中随机的提取一条记录插入到临时表#test中。
          
    ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
    */
    create procedure get_rnd_record
    asdeclare @state varchar(20),
    @var1  varchar(50), --保存记录中第一个字段
    @var2 varchar(50), --保存记录中第二个字段
    @var3  varchar(50) --保存记录中第三个字段
    create table #test(fld1 varchar(50),fld2 varchar(50),fld3 varchar(50))
    declare state_cursor cursor scroll for
    select distinct state from authors
    open state_cursor
    --FETCH RELATIVE 1 FROM state_cursor
    FETCH next from state_cursor into @state
    while @@FETCH_STATUS=0
    begin declare state_1_cursor cursor scroll for
    select state,au_fname,au_lname from authors where state=@state
    declare @row_count int --当前关键字的记录数
    declare @rnd_recd int  --随机记录数
    open state_1_cursor
    select state from authors where state=@state
    set @row_count=@@rowcount
    if @row_count=1 --如果只有一行
    begin
    FETCH next from state_1_cursor into @var1,@var2,@var3
    insert into #test values(@var1,@var2,@var3)
    end
    else --如果有多行
    begin
    set @rnd_recd=cast(right(RAND()*1000, 2) as int)--产生随机数
    while @rnd_recd>@row_count
    begin
    set @rnd_recd=cast(right(RAND()*1000, 2) as int)----产生随机数
    end
    FETCH relative @rnd_recd from state_1_cursor into @var1,@var2,@var3
    insert into #test values(@var1,@var2,@var3)
    end
    declare state_cursor cursor scroll for
    select distinct state from authors
    open state_cursor close state_1_cursor
    deallocate state_1_cursor --关闭游标
      FETCH next from state_cursor into @state
    end
    --fetch cursor1 into @i
    select * from #test
    drop table #test
    CLOSE state_cursor --关闭游标
    DEALLOCATE state_cursor
      

  14.   

    随机:select * into #2 from top2 order by newid()
    select identity(int,1,1) idx,* into #3 from #2select * from #3 a 
    where (select count(*) from #3 where field1=a.field1 and idx<=a.idx)<=2
    order by field1不随机,取前2
    select * from top2 a 
    where (select count(*) from top2 where field1=a.field1 and idx<=a.idx)<=2
    order by field1结果:
    随机:
    idx         id          field1 field2     field3     
    ----------- ----------- ------ ---------- ---------- 
    1           3           a      sdaa       asdaa
    3           1           a      aa         aaa
    2           7           b      agha       arewaa
    10          4           b      sdaa       dfaaa
    5           5           c      fgaa       gffaaa
    6           8           d      art        ghha
    9           6           d      fgaa       adsgdga
    7           12          e      art        ghha
    4           11          e      art        ghha(9 row(s) affected)
    不随机:
    id          field1 field2     field3     
    ----------- ------ ---------- ---------- 
    1           a      aa         aaa
    2           a      asasa      dfdfa
    4           b      sdaa       dfaaa
    7           b      agha       arewaa
    5           c      fgaa       gffaaa
    6           d      fgaa       adsgdga
    8           d      art        ghha
    9           e      art        ghha
    10          e      art        ghha(9 row(s) affected)