2010-05-03 5 views
7

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.

risposta

10

È possibile utilizzare ROWNUM. Numeri Questo pseudo-colonna le righe nel risultato:

Insert Into new_table (new_col, copied_col1, copied_col2) 
    Select Rownum, old_col1, old_col2 
    From old_table; 

Se si desidera che il record da ordinare, è necessario utilizzare una sotto-query:

Insert Into new_table (new_col, copied_col1, copied_col2) 
    Select Rownum, old_col1, old_col2 
    From (
     Select old_col1, old_col2 
     From old_table 
     Order By old_col1 
    ); 
+0

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? –

+0

@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. –

+0

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

-1

Perché non si fa a definire il colonna new_col come primary_key o unique e contrassegnala come autoincrement? In questo modo ogni inserto otterrà il successivo "conteggio" più alto.

Non ho molta familiarità con oracle, ma scommetto che c'è una funzione di autoincremento integrata.

+1

@Philipp Andre: non esiste una funzione * autoincrement *, Oracle utilizza invece sequenze. –

+0

@Peter Lang: Davvero? Questo mi sorprende, ma molto tempo fa ho giocato con Oracle. Bello sapere. Grazie! –

+0

Questo è quello che avrei fatto in SQL Server. :) –

Problemi correlati