2010-06-22 4 views
13

Nota: I am che pone la domanda a cui voglio rispondere. So che questa domanda significa che il database è impostato male. Quindi voterò in basso tutte le risposte che suggeriscono di cambiare il modo in cui il tavolo è impostato.Oracle: copia riga durante l'aggiornamento di un campo

Ho bisogno di duplicare un gruppo di righe, mentre si modifica un valore.

name col1 col2 
dave a nil 
sue b nil 
sam c 5 

deve diventare:

name col1 col2 
dave a nil 
dave a a 
sue b nil 
sue b a 
same c 5 

IE per tutte le voci in questa tabella in cui col2 is null, creare una nuova voce nella tabella in cui name e col1 sono il copiato, e col2 è a.

+0

Intendi dire "NULL" quando occasionalmente dichiari "nullo"? – tvCa

risposta

17

Usa:

INSERT INTO table 
    (name, col1, col2) 
SELECT t.name, t.col1, 'a' 
    FROM TABLE t 
WHERE t.col2 IS NULL 

Questo supponendo né i name o col1 colonne sono una chiave primaria o di avere un vincolo univoco su entrambi.

+0

Commento precedente cancellato: Ho trovato il mio bug. Sì, questo ha funzionato. Grazie! –

+3

Questo codice richiede la ripetizione dell'elenco di colonne della tabella e si interromperà se una colonna viene aggiunta alla tabella. C'è un modo per farlo senza elencare le colonne non interessanti? –

+0

@kevincline Vedi http://stackoverflow.com/a/28278824/1611055 –

3

Questo lo farà?

INSERT INTO yourtable 
     (SELECT name, col1, 'a' 
      FROM yourtable 
     WHERE col2 is NULL); 
+0

+1 buona risposta, anche se in realtà non funziona nel mio caso. Sto solo compilando alcuni campi nel tavolo. –

+0

Dovrebbe, ma rischia un errore ORA se ci sono più colonne nella tabella. –

+0

Sì, l'ipotesi era che la tabella avesse le colonne nell'esempio. – DCookie

0

Se il numero di colonne è di grandi dimensioni, è possibile copiare i dati desiderati in una tabella temporanea, alterare i dati nella tabella temporanea come si voleva, quindi copiare i contenuti della tabella temporanea nuovamente dentro l'originale ed elimina la tabella temporanea.