2013-06-21 15 views
5

Per eseguire alcuni test su un nuovo campo di tabella, vorrei ritagliare alcuni valori sui record esistenti nel mio database di test. Voglio assegnare un valore ad ogni ottavo record in una tabella. Posso facilmente selezionare ogni ottavo record utilizzando la seguente sintassi:Oracle SQL aggiorna ogni ennesima riga

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

Tuttavia, sono abbastanza nuovo per SQL, e io non riesco a essere in grado di convertire questo a una dichiarazione di aggiornamento. Qui vedo un sacco di risposte sulla selezione dell'ennesimo record, ma l'ho già capito. Qualsiasi assistenza sarebbe apprezzata.

+0

La vostra tabella di avere una chiave primaria? Quale ordinamento governa "ogni 8 ° record" o non ti interessa quali righe vengono aggiornate? – APC

+0

Ho finito per usare la risposta di Mikhail, ma per rispondere alla tua domanda, non mi importava quali fossero aggiornati - volevo solo un sottoinsieme consistente, distribuito in tutto il tavolo. – Travis

risposta

5

È necessario unirsi a questo all'istruzione UPDATE su qualsiasi tasto della tabella. Ad esempio, se si dispone di una colonna id unico, aggiornare dichiarazione sarà simile a questa:

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

Grazie! Questo funziona perfettamente. – Travis

1

Supponendo che il vostro tavolo ha un ID univoco per identificare ogni riga, si può fare qualcosa di simile:

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

si dovrebbe anche essere in grado di fare questo con una vista aggiornabile in linea (vedi 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

anche senza la chiave, è possibile utilizzare rowid in Oracle per questo scopo.

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

Tutte le buone risposte qui. Grazie! – Travis

4

Una risposta più breve:

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