2013-06-21 187 views
5

要對新的表字段進行一些測試,我想在測試數據庫中的現有記錄上僞裝一些值。我想爲表中的每個第8條記錄分配一個值。我可以使用此語法很容易地選擇每8個記錄:Oracle SQL每隔一行更新一次

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

不過,我是相當新的SQL,我似乎無法能夠將其轉換爲一個更新語句。我在這裏看到很多關於選擇第n個記錄的答案,但我已經知道了。任何援助將不勝感激。

+0

請問您的表有一個主鍵?什麼順序管理「每8條記錄」或不關心哪些行更新? – APC

+0

我結束了使用米哈伊爾的答案,但回答你的問題,我真的不在乎哪些更新 - 我只是想要一個可觀的子集,分佈在整個表。 – Travis

回答

5

您需要將此參數加入表中任意鍵上的UPDATE語句。舉例來說,如果你有一個唯一的ID列,更新語句將是這樣的:

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;