从表1(15条记录)中选择10条随机数据到表2中,但是不能有重复数据(表1中不会有重复数据),请问用sql(存储过程)语句该怎么写,或是大家有什么好的其他想法,请告知一二 .
谢谢!得到答案立即揭贴!

解决方案 »

  1.   

    在我的blog里专门有解决此类问题的一种算法,叫做“跳蚤算法”。
    http://blog.csdn.net/KiteGirl/虽然这个算法不是实际用在SQL里面的,但是你可以用“快速跳蚤算法”获得10个随机排列的记录号,然后根据记录号抽取对应数据库记录,达到同样效果。
      

  2.   

    select top 10 * into test from A order by newid()
      

  3.   

    KiteGirl(小仙妹)
    先谢谢你的Bolg  就去看看
    guyehanxinle
    谢谢 你给的答案,不过我想在access实现,这个怪我没说清楚
      

  4.   

    其实这个算法描述起来很简单:
    Swap A(i),A(r)A()数组包含你取值范围内的所有值(比如0 to n)。在初始条件下是顺序排列(因为这样简单)。1、原始跳蚤算法:
    将数组每个元素A(i)与随机的元素A(r)交换值。则A()的所有元素是随机排列的。
    在一个随机排列的A()里面,如果你需要x个随机序列,只要从乱序后的A()里顺序取x个元素就可以了。2、快速跳蚤算法:
    如果你只需要x个随机序列,而x<n。将数组前x个元素A(0)到A(x)依次与随机元素A(r)交换,则A(0)到A(x)是随机序列。跳蚤算法是针对Long类型数组操作的。虽然可以用于其他类型甚至数据库,但那样写起来很麻烦。
    一般情况下,是将一个表的记录号或者地址存储于long数组,将long数组乱序后,根据随机取得的long类型的记录号取记录,实现随机抽取记录的目的。
    通过这种以long数组表示序列号、地址的方式,针对long数组的该算法可以应用于各种用途。在1 to 15当中随机抽取10个的跳蚤算法是这样写的(采用快速跳蚤算法):Randomize TimerDim A(0 to 14) As long
    Dim I as long 
    Dim T as long
    Dim R as long'初始化A()。需要说明的是,它里面未必一定是1到15这些数字。可以是其他任意数值(比如15个学生的号码、15道题目在书中的序号)。一般来说只要不重复就好(偶尔例外情况下也有重复的例子)。For I=0 to 14 
      A(I)=I+1
    Next'乱序过程For I=0 to 9
      R=Int(rnd*15)
      T=A(I):A(I)=A(R):A(R)=T '交换A(I)和A(R)
    Next取A(0)到A(9)这10个元素就是值在1 to 15之间的随机不重复数。如果你想再次取10个随机序列。只要把乱序再来一次就可以了。不用重新初始化。需要说明的是,跳蚤算法只能保证这10个数字没有重复的。但不能保证前后两次取得10个数字的排列是不重复的。好比你从15道题中随机抽取10道给学生,只能保证一道题不会在一个试卷上出现多次。但不能保证每个学生的试卷肯定是一样的。跳蚤算法是我在念高中时候发现的。当时的用途就是帮我的老师随机生成试卷,并且在这个用途中不断改进。完整的跳蚤算法有扫描范围和交换范围的参数,可以十分方便地在指定的范围内(比如题库的第100到200号记录之间)出固定数量的随机题目。这个完整函数就提供在我的Blog里,叫做FleaRandom函数。这个算法是为教育服务的,但不幸的是我发现它更多地被用在博彩方面。
      

  5.   

    access没有newid,也没有存储过程,SQL语句可以用rnd来排序获得随机数据,不过,很不幸的是这个随机数是固定不变的,就是你每一次运行程序起始随机数全是一样的。所以access要解决随机问题,你只能取出全部数据的相关ID,到程序中去处理, 这样小仙妹的算法不失为一种很好的算法了,值得你参考......