while @i<5 
begin
  select top 1 @lastID=id, @friend=src_num 
  from sms.dbo.tbl_lt_order where id <>@lastID order by newid()
    if exists(select * from sms.dbo.tbl_friend 
    where src_id!=@src_id and friend!=@friend)
end

解决方案 »

  1.   

    用游标啊.declare @friend varchar(20)
    declare #aa cousor for select top 5 src_num from sms.dbo.tbl_lt_order order by newid()
    open #aa
    fetch next from #aa into @friend
    while @@fetch_status=0
    begin
      if exists(select * from sms.dbo.tbl_friend 
        where src_id!=@src_id and friend!=@friend)
      fetch next from #aa into @friend
    end
    close #aa
    deallocate #aa
      

  2.   

    while @i<5 
    begin
      select top 1 @lastID=id, @friend=src_num 
      from sms.dbo.tbl_lt_order where id <>@lastID order by newid()
        if exists(select * from sms.dbo.tbl_friend 
        where src_id!=@src_id and friend!=@friend)
    end
      

  3.   

    while @i<5 
    begin
      select top 1 @friend=src_num 
      from (select * from sms.dbo.tbl_lt_order group by 所有字段) as aa order by newid()
        if exists(select * from sms.dbo.tbl_friend 
        where src_id!=@src_id and friend!=@friend)
    end
      

  4.   

    to CrazyFor(蚂蚁) 
    我那个是对表做了5次扫描,每次只要不是@lastid的话,还是可能出现重复的记录,并且不能够取到最后的那一条记录。
      

  5.   

    用标记来实现,
    在表里加一个字段,INT 就可以了,已经抽取过的记录,打上标记,以后就不会在抽到重复的了
      

  6.   

    to zjcxc
    用游标确实是个好的方法,不过当有相同记录时,可能取不到五条记录,我想这个应该比较好控制,谢谢。
      

  7.   

    那你可以在定义游标时用distinct过滤掉相同的记录啊.declare @friend varchar(20)
    declare #aa cursor for select distinct top 5  src_num from sms.dbo.tbl_lt_order order by newid()
    open #aa
    fetch next from #aa into @friend
    while @@fetch_status=0
    begin
      if exists(select * from sms.dbo.tbl_friend 
        where src_id!=@src_id and friend!=@friend)
      fetch next from #aa into @friend
    end
    close #aa
    deallocate #aa
      

  8.   

    那我在order by中怎样写啊?
      

  9.   

    我的方法里不是有order by吗?
      

  10.   

    如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中。这是系统回复的。order by 加了也不行!
      

  11.   

    是我没有完整测试,这样写吧:declare @friend varchar(20),@src_id int
    declare #aa cursor for select distinct top 5  src_num from(select top 100 percent src_num from sms.dbo.tbl_lt_order order by newid()) a
    open #aa
    fetch next from #aa into @friend
    while @@fetch_status=0
    begin
      if exists(select * from sms.dbo.tbl_friend 
        where src_id!=@src_id and friend!=@friend)
      fetch next from #aa into @friend
    end
    close #aa
    deallocate #aa
      

  12.   

    谢谢 zjcxc,我加了一个while 条件,不知道会不会有什么问题。
                 declare #aa cursor for select top 20 src_num from sms.dbo.tbl_lt_order order by newid()
                 open #aa
                 fetch next from #aa into @friend
                 while @@fetch_status=0
                   begin
                     while @i<5
                       begin
                         if exists(select * from sms.dbo.tbl_friend where src_id=@src_id and friend=@friend)
                           print @i
                         else
                           begin
                             set @msg_text2=@msg_text2+','+(CAST(@friend AS varchar(10)))
                             set @i=@i+1
                           end 
                        fetch next from #aa into @friend
                      end                 fetch next from #aa into @friend
                   end
                close #aa
                deallocate #aa