2013-06-21 141 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;