我有一个大约有1000行的表.我必须将表中的一列(“X”)更新为’Y’表示n个ramdom行.为此我可以有以下查询
update xyz set X='Y' when m in ( 'SELECT m FROM (SELECT m FROM xyz order by dbms_random.value ) RNDM where rownum < n+1);
解决方法
我会使用ROWID:
UPDATE xyz SET x='Y' WHERE rowid IN ( SELECT r FROM ( SELECT ROWID r FROM xyz ORDER BY dbms_random.value ) RNDM WHERE rownum < n+1 )
我使用ROWID的实际原因不是效率(它仍然会进行全表扫描) – 如果列m不是唯一的,则sql可能不会更新所需的行数.
只有1000行,你不应该真的担心效率(可能有一亿行).如果没有此表中的任何索引,您将无法执行全表扫描以选择随机记录.
[编辑:]“但如果有10万行怎么办”
嗯,这仍然是3个数量级,低于1亿.
我运行了以下内容:
create table xyz as select * from all_objects;
[在我的系统上创建了大约50,000行 – 非索引,就像你的表一样]
UPDATE xyz SET owner='Y' WHERE rowid IN ( SELECT r FROM ( SELECT ROWID r FROM xyz ORDER BY dbms_random.value ) RNDM WHERE rownum < 10000 ); commit;
这花了大约1.5秒.也许是1秒钟,也许是3秒钟(没有正式计时,它只花了足够的时间眨眼).