2012-01-13 32 views
5

Ho bisogno di copiare i dati da una tabella a un'altra. Le tabelle non hanno tutte le stesse colonne, o ordine; ma i dati da copiare sono sempre nelle stesse colonne; ovvero i dati della colonna foo devono essere copiati nelle colonne foo.Copia dati tabella con colonne comuni

Se era solo due tavoli ho potuto solo hardcode i nomi delle colonne come:

INSERT INTO table_target (column1, column2, column4) 
    SELECT column1, column2, column4 FROM table_source; 

Tuttavia ci sono un paio di dozzine di tavoli, e un po 'di trasformazione in più deve essere fatto, quindi sarebbe bello se potessi semplicemente dire: copia qualsiasi colonna corrispondente e ignora il resto.

Sono riuscito a capire come ottenere un elenco delle colonne comuni, ma ora sono bloccato.

SELECT src.col 
    FROM (SELECT COLUMN_NAME as col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_target') as trg 
INNER JOIN 
    (SELECT COLUMN_NAME as col 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'table_source') as src ON (src.col=trg.col) 
; 
+1

puoi usare sql dinamico? stai usando SQL in un altro linguaggio di programmazione? – golimar

+0

questo sembra un compito una tantum. È vero? O è qualcosa che deve correre ripetutamente, forse in produzione? Se si tratta di una cosa singola, è possibile utilizzare il codice precedente (con alcune modifiche) per generare più SQL e quindi eseguire l'SQL generato. – MJB

+0

Sì, è una query una tantum e la soluzione che ho utilizzato è stata essenzialmente questa procedura in due passaggi. Ancora, sarebbe bello sapere come farlo "correttamente". – Odalrick

risposta

2

mi trucco ho usato in passato con buoni risultati è quello di scrivere una query che restituisce SQL, quindi basta copiare-incollare nella shell di comando db. In questo caso, questa sarebbe la vostra richiesta:

SELECT CONCAT(
    'INSERT INTO table_target (', 
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3" 
    ') SELECT ', 
    GROUP_CONCAT(trg.col), -- produces output like "col1, col2, col3" 
    ' FROM table_source;') as sql_stmt 
FROM (
(SELECT COLUMN_NAME as col 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'table_target') as trg 
INNER JOIN 
(SELECT COLUMN_NAME as col 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'table_source') as src ON src.col=trg.col) x; 

Questo fa uso di pratica funzione di mysql GROUP_CONCAT che aggrega il valore in un CSV - perfetto per la creazione di un elenco di nomi di colonna per la generazione di SQL

anche io avvolto la tua query in un alias in modo che possiamo selezionare da esso.

+0

E quindi la query potrebbe essere eseguita istantaneamente in base a [questa domanda] (http://stackoverflow.com/questions/999200/is-it-possible-to-execute-a-string-in-mysql). Grazie. Ancora sono diffidente nei confronti di tutto ciò che è simile alla valutazione. – Odalrick

Problemi correlati