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行しかないので、効率について心配する必要はありません(1億行の場合もあります)。このテーブルにインデックスがないと、ランダムなレコードを選択するために全表スキャンを実行するのに行き詰まります。
[編集:] 「しかし、100,000行ある場合はどうなるか」
ええと、それでも1億未満の3桁です。
私は以下を実行しました:
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秒でした(正式に時間を計っていませんでした、まばたきするのにちょうど十分な時間がかかりました)。