Oracle SQL оновлюється кожному n-му рядку

Щоб виконати тестування в новому полі таблиці, я б хотів підробити деякі значення на існуючих записах в моїй тестовій базі даних. Я хочу присвоїти значення кожному 8-му запису в таблиці. Я можу легко вибрати кожен восьмий запис за допомогою цього синтаксису:

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

Однак, я досить новий для SQL, і я, здається, не зможу перетворити це в твердження оновлення. Я бачу багато відповідей тут про вибір n-й записів, але я вже це отримав. Будь-яка допомога була б оцінена.

5
У таблиці є первинний ключ? Яке замовлення керує "кожна восьма запис" або не цікавить, які рядки оновлюються?
додано Автор APC, джерело
Я опинився з відповіддю Михайла, але, щоб відповісти на ваше запитання, я дійсно не дбав про те, що вони були оновлені - я просто хотів значного підмножини, розповсюджуваного по всій таблиці.
додано Автор Travis, джерело

7 Відповіді

Вам потрібно приєднатись до цього в операторі 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)
5
додано
Дякую! Це чудово працює.
додано Автор Travis, джерело

Вам потрібно приєднатись до цього в операторі 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)
5
додано
Дякую! Це чудово працює.
додано Автор Travis, джерело

Коротка відповідь:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0;
4
додано

Коротка відповідь:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0;
4
додано

Припускаючи, що ваш таблиця має унікальний ідентифікатор для ідентифікації кожного рядка, ви можете зробити щось подібне:

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 . . .
1
додано

навіть без ключа, ви можете використовувати rowid в oracle для цієї мети.

update mytable
set mycol = new_value
where rowid in
(select rowid from 
  (select rownum rn, id from mytable)
where mod(rn, 8) = 0)
1
додано
Тут є всі сорти хороших відповідей. Дякую!
додано Автор Travis, джерело

навіть без ключа, ви можете використовувати rowid в oracle для цієї мети.

update mytable
set mycol = new_value
where rowid in
(select rowid from 
  (select rownum rn, id from mytable)
where mod(rn, 8) = 0)
1
додано
Тут є всі сорти хороших відповідей. Дякую!
додано Автор Travis, джерело