5

要对新表字段进行一些测试,我想在我的测试数据库中的现有记录上伪造一些值。我想为表中的每 8 条记录分配一个值。我可以使用以下语法轻松选择每 8 条记录:

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

但是,我对 SQL 还很陌生,似乎无法将其转换为更新语句。我在这里看到很多关于选择第 n 条记录的答案,但我已经知道了。任何援助将不胜感激。

4

4 回答 4

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)
于 2013-06-21T13:28:25.757 回答
4

一个简短的答案:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0;
于 2013-06-21T13:53:05.980 回答
1

假设您的表有一个唯一的 id 来标识每一行,您可以执行以下操作:

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

您还应该能够使用内联可更新视图来执行此操作(请参见此处):

update (select jeffs_field_to_update
        from  (select rownum rn, jeffs_field_to_update
              from jeff)
        where mod(rn, 8) = 0
       ) toupdate
    set . . .
于 2013-06-21T13:29:07.030 回答
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)
于 2013-06-21T13:34:30.390 回答