2009-11-24 3 views

risposta

2

Se T1 e T2 corrispondono esattamente alle due opzioni disponibili. È possibile select tutte le colonne da T2 per il numero insert into T1 oppure è possibile fornire un elenco di colonne all'istruzione insert.

Anche se si esegue un MSSQL select, le intestazioni di colonna non vengono utilizzate da un'istruzione insert per far corrispondere le colonne.

1

Perché non semplicemente

INSERT INTO t1 
SELECT * FROM T2 
+5

ho bisogno di saltare una colonna (quella che è l'identità chiave primaria) –

12

Sì, è possibile omettere i nomi dei campi per la tabella che si inserisce a, ed è possibile utilizzare select * per ottenere tutti i campi della tabella, ma non vorrei raccomandare questo approccio.

Se si omette il nome del campo, i campi sono abbinati per posizione, non per nome. Se i campi non sono nello stesso ordine, verranno mescolati. In generale, dovresti evitare di fare affidamento sul layout esatto delle tabelle, per ridurre al minimo il rischio che le modifiche nelle tabelle interrompano le query.

+1

Esiste un modo per inserire tutte le colonne tranne la key' 'identità senza specificare tutti i nomi di colonna?Le tabelle con cui lavoro contengono dozzine di colonne e elencarle ogni volta sono davvero noiose. –

+0

Forse potresti creare una vista con tutte le colonne che vuoi e selezionare * da essa. – cindi

+1

@ Konstantin: No, non esiste un modo semplice per specificare tutti i campi tranne il campo identità. È tutto o niente. – Guffa

12

Utilizzare sempre colonne esplicite sia nell'INSERT che nella proiezione SELECT. Anche se non si vuole, è necessario:

INSERT INTO T1 (C1, c2) 
SELECT C1, C2 FROM T2 
+3

Questa è la duplicazione del codice di cui voglio liberarmi a favore dell'approccio basato sulla convenzione (le colonne con lo stesso nome dovrebbero solo mapparsi l'una con l'altra) –

+2

La duplicazione del codice non dovrebbe essere una buona pratica. –

+2

SQL è generalmente un linguaggio dettagliato. Ad esempio la clausola group by è ridondante nelle aggregazioni, INTO è ridondante. Penso che devi solo accettarlo. – cindi

0

Se siete preoccupati per i nomi delle colonne si può sempre alias loro:

INSERT INTO T1 (C1, c2) 
SELECT C1 AS C1_ALIAS, C2 AS C2_ALIAS FROM T2 

O, più succintamente:

INSERT INTO T1 (C1, c2) 
SELECT C1 C1_ALIAS, C2 C2_ALIAS FROM T2 

Anche se non riesco davvero a pensare perché uno vorrebbe in un esempio così semplice

+0

È possibile avere un alias per un numero di colonne? Ad esempio, 'inserire nella selezione T1 ALL_COLUMNS_ALIAS (C1, C2, C3) come ALL_COLUMNS_ALIAS da T2'? –

-1

Si riferisce come segue:

0

Prima selezionare questo sql, ha scelto la riga della tabella da sql result e ha cambiato il nome della tabella di destinazione o di origine. Se le tabelle hanno le stesse colonne (lo stesso ordine non è necessario) funzionerà.

 
with xparams as (  select (select user from dual) "OWNER", '' "ADDSTRTOFROMTABLENAME" from dual ) 
    ,t1 as ( SELECT dbat.table_name from dba_tables dbat, xparams where dbat.owner = xparams.OWNER) 
    ,t1c1 as ( SELECT utcs.table_name , LISTAGG(utcs.column_name,',') within group (order by utcs.column_name) "COLS" from USER_TAB_COLUMNS utcs, t1 where utcs.table_name = t1.table_name group by utcs.table_name) 
    ,res1 as (SELECT 'insert into '|| t1c1.table_name || ' ('|| t1c1.COLS ||') select '|| t1c1.COLS || ' from ' || t1c1.table_name||xparams.ADDSTRTOFROMTABLENAME ||';' "RES" from t1c1, xparams order by t1c1.table_name) 
select * from res1