2013-06-21 14 views
5

新しいテーブルフィールドでいくつかのテストを行うには、テストデータベースの既存のレコードの値をいくつか偽造したいと思います。テーブルの8番目のレコードごとに値を割り当てたい。私は簡単にこの構文を使用して、すべての8番目のレコードを選択することができます。n番目の行ごとにOracle SQLが更新されます

select * 
from 
    (select rownum rn 
    , jeffs_field_to_update 
    from jeff) 
where mod(rn, 8) = 0; 

しかし、私はSQLにかなり新たなんだ、と私は更新文にこれを変換することができるように見えることはできません。ここではn番目のレコードの選択について多くの回答がありますが、すでに取得済みです。いかなる援助も感謝します。

+0

は、あなたのテーブルには主キーを持っていますか? 「すべての8番目のレコード」を管理する順序、または更新される行が気にしない順序は? – APC

+0

私はMikhailの答えを使用して終了しましたが、あなたの質問に答えるために、私は本当に更新された気にしませんでした - 私はテーブル全体に分散したかなりのサブセットを望んでいました。 – Travis

答えて

5

テーブルのどのキーでもUPDATEステートメントにこれを参加させる必要があります。あなたはユニークなID列を持っている場合たとえば、UPDATE文は次のようになります。あなたのテーブルを想定し

update jeff 
set jeffs_field_to_update = value 
where id in 
(select id 
from 
    (select rownum rn 
    , jeff.id 
    from jeff) 
where mod(rn, 8) = 0) 
+0

ありがとうございます!これは完全に機能します。 – Travis

1

は、各行を識別するための一意のIDを持っている、あなたはこのような何かを行うことができます。

update jeff 
    set . . . 
    where id in (select id 
       from (select rownum as rn, id 
         from jeff 
        ) 
       where mod(rn, 8) = 0 
       ) 

また、(hereを参照)インライン更新可能なビューでこれを行うことができる必要があります:

update (select jeffs_field_to_update 
     from (select rownum rn, jeffs_field_to_update 
       from jeff) 
     where mod(rn, 8) = 0 
     ) toupdate 
    set . . . 
1

でもキーなしで、あなたは、この目的のためにOracleでROWIDを使用することができます。

update mytable 
set mycol = new_value 
where rowid in 
(select rowid from 
    (select rownum rn, id from mytable) 
where mod(rn, 8) = 0) 
+0

良い答えのすべての種類。ありがとう! – Travis

4

短い答え:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0; 
関連する問題