要对新表字段进行一些测试,我想在我的测试数据库中的现有记录上伪造一些值。我想为表中的每 8 条记录分配一个值。我可以使用以下语法轻松选择每 8 条记录:
select *
from
(select rownum rn
, jeffs_field_to_update
from jeff)
where mod(rn, 8) = 0;
但是,我对 SQL 还很陌生,似乎无法将其转换为更新语句。我在这里看到很多关于选择第 n 条记录的答案,但我已经知道了。任何援助将不胜感激。
要对新表字段进行一些测试,我想在我的测试数据库中的现有记录上伪造一些值。我想为表中的每 8 条记录分配一个值。我可以使用以下语法轻松选择每 8 条记录:
select *
from
(select rownum rn
, jeffs_field_to_update
from jeff)
where mod(rn, 8) = 0;
但是,我对 SQL 还很陌生,似乎无法将其转换为更新语句。我在这里看到很多关于选择第 n 条记录的答案,但我已经知道了。任何援助将不胜感激。
您需要将此加入到表中任何键的 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)
一个简短的答案:
UPDATE jeff
SET jeffs_field_to_update = value
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0;
假设您的表有一个唯一的 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 . . .
即使没有密钥,您也可以在 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)