一个小问题

marcovanbasten 2006-08-28 08:52:47
我想实现如下效果:
在某个表中每次都抽取一些随机记录(这个我已实现),下次抽取时,已经抽取过的就不在被抽取的范围之内了。

SELECT b FROM fff WHERE x=1 FOR UPDATE NOWAIT
以上这句SQL是否可以实现呢?如果能,接下来该如何操作?
如果不能,盼告之,急。
...全文
209 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw_delphi 2006-09-04
  • 打赏
  • 举报
回复
问题已经解决了;我也来顶下
一般的解决办法:
1.建一个临时表,将提取出来的数据插进去
然后在查询的时候用 not in(...) 或者 not exists(...) 关联下;去掉临时表里存在的记录
2.也可以在表里增加一个字段,作为标记
Eric_1999 2006-09-04
  • 打赏
  • 举报
回复
用临时表纪录或者做标记咯。
xiaoxiao1984 2006-08-29
  • 打赏
  • 举报
回复
支持feng2(蜀山风云) 和wiler(@_@)
两种方式都可以实现楼主需要的结果
wiler 2006-08-29
  • 打赏
  • 举报
回复
在表中加一列做标志,已被抽取过的打上1,没有抽取过的打0
feng2 2006-08-29
  • 打赏
  • 举报
回复
既然是随即数据,在不同的事务里面怎么能确定呢?

将之前随即抽取的数据,能标识唯一性的列保存在一个Table里面。
下次随即抽取的时候可以排除之前随即抽取的数据。
skystar99047 2006-08-29
  • 打赏
  • 举报
回复
如果被抽取的记录不再被抽取是永久的,很显然需要在表中增加一个标志字段,或采用其它方式记录已经抽取到的记录。
xiaoxiao1984 2006-08-29
  • 打赏
  • 举报
回复
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表中,最后返回一个游标

marcovanbasten 2006-08-29
  • 打赏
  • 举报
回复
在表中加一列做标志,已被抽取过的打上1,没有抽取过的打0
----------------------------
上面这个方法可行,可以设一个列,缺省值是0,如果抽取过就设为1,不知如何用一条SQL搞定?
难道先UPDATE,然后再SELECT得到当前的查询结果?
LinZhongBao 2006-08-28
  • 打赏
  • 举报
回复
上面那个语句,取出的是有符合条件X=1的数据,

FOR UPDATE NOWAIT
如果你没有ROLLBACK ,COMMIT 掉的话,就还是锁住的,别的是取不到的

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧