Ho bisogno di copiare alcuni dati da una tabella a un'altra in Oracle, generando valori incrementali per una colonna numerica nella nuova tabella. Questo è un esercizio solo una volta con un numero banale di righe (100).Generazione di valori di colonna numerica incrementale durante l'istruzione INSERT SELECT
Ho una soluzione adeguata a questo problema ma sono curioso di sapere se esiste un modo più elegante.
lo sto facendo con una sequenza temporanea, in questo modo:
CREATE SEQUENCE temp_seq
START WITH 1;
INSERT INTO new_table (new_col, copied_col1, copied_col2)
SELECT temp_seq.NEXTVAL, o.*
FROM (SELECT old_col1, old_col2
FROM old_table,
ORDER BY old_col1) o;
DROP SEQUENCE temp_seq;
C'è modo a che fare con senza creare la sequenza o qualsiasi altro oggetto temporaneo? In particolare, questo può essere fatto con un'istruzione INSERT SELECT autonoma?
Si prega di considerare un trigger come non opzione.
MORE INFO: vorrei per controllare l'ordine che le nuove righe vengono inserite, e non sarà lo stesso ordine in cui sono stati creati nel vecchio tavolo (nota ho aggiunto la clausola ORDER BY sopra). Ma voglio ancora che la mia nuova colonna sequenziale inizi da 1.
Ci sono domande simili, ma credo che le specifiche della mia domanda siano originali di SO.
Peter, vedere i criteri aggiuntivi che ho aggiunto alla domanda. Questo metodo sembra inserire le righe nell'ordine in cui sono state create nella vecchia tabella, ma vorrei imporre il mio ordine. Se non fosse per questo requisito, il tuo metodo sarebbe perfetto. Qualche idea? –
@Charles: la mia query in realtà non ordina le righe, quindi è probabile che vengano inserite nell'ordine in cui sono state create (ma non sono garantite). Hai provato ad applicare il tuo 'ORDER BY' alla mia richiesta? Mi aspetto che funzioni. –
Quindi aggiungere l'ORDER BY all'istruzione select. Questo dovrebbe farti quello che vuoi. ROWNUM genera semplicemente un numero di sequenza per i record nell'ordine recuperato. – DCookie