2013-09-03 17 views
8

Quindi, per ciascun valore distinto in una colonna di una tabella, desidero inserire tale valore univoco in una riga di un'altra tabella.Inserire valori distinti da una tabella in un'altra tabella

list = select distinct(id) from table0 

for distinct_id in list 
insert into table1 (id) values (distinct_id) 
end 

Qualche idea su come procedere?

risposta

19

Ogni volta che si pensa di fare qualcosa in un ciclo, fare un passo indietro e ripensarci. SQL è ottimizzato per funzionare con i set. È possibile farlo utilizzando una query basata su set senza la necessità di ciclo:

INSERT dbo.table1(id) SELECT DISTINCT id FROM dbo.table0; 

Ci sono alcuni casi limite in cui loop può avere più senso, ma come SQL Server matura e si aggiunge più funzionalità, quei casi limite ottengono più stretti ...

+0

Sarebbe possibile creare una tabella "auto-aggiornata" solo per memorizzare questi valori distinti. Ad esempio, se vengono rimossi o aggiornati alla tabella 0, verranno anche aggiornati alla tabella 1. –

+0

@Gabriel Sure, creare una vista indicizzata. –

+0

grazie, cercherò questo argomento, creando visualizzazioni indicizzate di valori univoci. Se fossero date uniche di molti "mesi", sarebbe ancora lo stesso giusto? Sto parlando di un registro di sensori che memorizza i numeri ogni secondo. E mi piacerebbe sapere quali date ho a disposizione per cercare all'interno. –

5
insert into table1 (id) 
select distinct id from table0 
0

Altro modo semplice per copiare i dati distinti con più colonne da un tavolo all'altro

Insert into TBL2 
Select * from (Select COL1, ROW_NUMBER() over(PARTITION BY COL1 Order By COL1) AS COL2 From TBL1)T 
where T.COL2 = 1 
1

La seguente dichiarazione lavora con me.

insert into table1(col1, col2) select distinct on (col1) col1 col2 from table0 
Problemi correlati