我想实现如下效果:
在某个表中每次都抽取一些随机记录(这个我已实现),下次抽取时,已经抽取过的就不在被抽取的范围之内了。SELECT b FROM fff WHERE x=1 FOR UPDATE NOWAIT
以上这句SQL是否可以实现呢?如果能,接下来该如何操作?
如果不能,盼告之,急。

解决方案 »

  1.   

    上面那个语句,取出的是有符合条件X=1的数据,FOR UPDATE NOWAIT
    如果你没有ROLLBACK  ,COMMIT 掉的话,就还是锁住的,别的是取不到的
      

  2.   

    既然是随即数据,在不同的事务里面怎么能确定呢?将之前随即抽取的数据,能标识唯一性的列保存在一个Table里面。
    下次随即抽取的时候可以排除之前随即抽取的数据。
      

  3.   

    支持feng2(蜀山风云) 和wiler(@_@) 
    两种方式都可以实现楼主需要的结果
      

  4.   

    在表中加一列做标志,已被抽取过的打上1,没有抽取过的打0
    ----------------------------
    上面这个方法可行,可以设一个列,缺省值是0,如果抽取过就设为1,不知如何用一条SQL搞定?
    难道先UPDATE,然后再SELECT得到当前的查询结果?
      

  5.   

    feng2(蜀山风云) 的方式:新建一张B表,表中存放了曾经被抽取的记录的标识字段
    当需要随机抽取一定纪录的时候,建立一个存储过程C,在存储过程中:
    declare cursor csr is  
    select * from (
      select * from tab_name a 
        where not exists (select 1 from tab_name b where a.关键字 = b.关键字) 
      order by dbms_random.value 
    ) where rownum <= N且将取得的N条记录的关键字加入到B表中,最后返回一个游标
      

  6.   

    问题已经解决了;我也来顶下
    一般的解决办法:
    1.建一个临时表,将提取出来的数据插进去
      然后在查询的时候用 not in(...) 或者 not exists(...) 关联下;去掉临时表里存在的记录
    2.也可以在表里增加一个字段,作为标记