2013-06-21 21 views
5

Aby wykonać pewne testy na nowym polu tabeli, chciałbym podrobić niektóre wartości z istniejących rekordów w mojej testowej bazie danych. Chcę przypisać wartość do każdego ósmego rekordu w tabeli. Mogę łatwo wybrać co 8 rekord używając następującej składni:Aktualizacja Oracle SQL co n-ty wiersz

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

Jednak jestem całkiem nowy, SQL, i nie wydaje się być w stanie przerobić to na rachunku aktualizacji. Widzę tu wiele odpowiedzi na temat wyboru n-tych nagrań, ale już to mam. Każda pomoc będzie doceniona.

+0

Czy Twój stół mieć klucz podstawowy? Jakie uporządkowanie reguluje "co ósmy rekord" lub nie obchodzi, które wiersze są aktualizowane? – APC

+0

Skończyłem z wykorzystaniem odpowiedzi Michaiła, ale aby odpowiedzieć na twoje pytanie, nie obchodziło mnie, które zostały zaktualizowane - chciałem tylko sporego podzestawu, rozprowadzanego po całym stole. – Travis

Odpowiedz

5

Musisz dołączyć do tej instrukcji UPDATE na dowolnym kluczu w tabeli. Na przykład, jeśli masz niepowtarzalną kolumnę id, aktualizować oświadczenie będzie wyglądać następująco:

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

Dziękujemy! To działa idealnie. – Travis

1

Zakładając, że tabela ma unikatowy identyfikator każdego wiersza, można zrobić coś takiego:

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

należy także być w stanie to zrobić z inline aktualizować widzenia (patrz 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

nawet bez klucza, można użyć rowid w wyroczni do tego celu.

update mytable 
set mycol = new_value 
where rowid in 
(select rowid from 
    (select rownum rn, id from mytable) 
where mod(rn, 8) = 0) 
+0

Tutaj znajdziesz wiele dobrych odpowiedzi. Dzięki! – Travis

4

Krótsza odpowiedź:

UPDATE jeff 
SET jeffs_field_to_update = value 
WHERE mod(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID), 8)=0;