2015-11-15 21 views
5

Desidero aggiornare una colonna della tabella con il numero di riga. Ogni riga nella colonna empid deve essere aggiornata con il numero di riga correlato. Ho provato la seguente domanda.Aggiornare la colonna della tabella Oracle con il numero di riga

UPDATE employee SET empid = row_number(); 

Ma questo non funziona. Qualche idea?

+0

È sintatticamente sbagliato. Non è possibile utilizzare la funzione analitica di 'ROW_NUMBER()' in questo modo. Devi mostrarci l'output desiderato con un esempio. L'ordine è importante qui? –

+0

L'ordine non è importante – Tom

+1

Quindi utilizzare semplicemente 'ROWNUM'. –

risposta

4

Innanzitutto, questa non è la sintassi corretta per la funzione row_number(), poiché manca la clausola over (che genera un errore ORA-30484). Anche se lo fosse, ciò non funzionerebbe, in quanto non è possibile utilizzare direttamente le funzioni della finestra in una clausola set (con conseguente errore ORA-30483).

Per questo caso d'uso, tuttavia, si potrebbe utilizzare il rownum pseudo-colonna:

UPDATE employee SET empid = ROWNUM; 

SQLFiddle

1

Si potrebbe fare qualcosa di simile a quanto segue. Puoi modificare l'ordine ORDINA per ordinare le righe se necessario.

UPDATE emp 
SET empid = emp.RowNum 
FROM (SELECT empid, ROW_NUMBER() OVER (ORDER BY empid) AS rowNum FROM employee) emp 
0

UPDATE dipendente SET empid = row_number();

In primo luogo, è sintatticamente errato.

In secondo luogo, non è possibile utilizzare la funzione analitica ROW_NUMBER() senza analytic_clause.

Come hai risposto al mio commento che l'ordine non è importante per te, puoi semplicemente usare ROWNUM.

UPDATE employee SET empid = ROWNUM; 

Assegna il valore di pseudo-colonna selezionando a caso le righe. Dato che stai assegnando EMPID, ti suggerisco di prendere in considerazione l'ordine.

Generalmente gli ID dipendenti vengono generati utilizzando un oggetto SEQUENCE. Ci sono due modi per implementare la funzionalità di auto-incremento:

0

si potrebbe anche fare questo

create table your_table_name as 
select row_number() over(order by 1) as serial_no, a.* from your_query a 

crea il numero di serie quando si scrive il tavolo stesso. (nota che non è impostato come PK se vuoi agire come pk)