2012-01-13 11 views
5

Necesito copiar datos de una tabla a otra. Las tablas no tienen todas las mismas columnas u orden; pero los datos que se copiarán siempre están en las mismas columnas; es decir, los datos de la columna foo deben copiarse en las columnas foo.Copie los datos de la tabla con columnas comunes

Si era sólo dos mesas que sólo podía codificar los nombres de columna como:

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

Sin embargo, hay un par docena de mesas, y alguna transformación adicional hay que hacer, por lo que sería bueno si pudiera decir: copie las columnas correspondientes e ignore el resto.

He logrado averiguar cómo obtener una lista de las columnas comunes, pero ahora estoy atascado.

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

puede usar dynamic sql? ¿estás usando SQL dentro de otro lenguaje de programación? – golimar

+0

esto suena como una tarea de una sola vez. ¿Es eso cierto? ¿O es algo que tiene que ejecutarse repetidamente, tal vez en producción? Si se trata de algo único, puede usar el código anterior (con algunos cambios) para generar más SQL y luego ejecutar el SQL generado. – MJB

+0

Sí, es una consulta única, y la solución que terminé usando fue esencialmente este proceso de dos pasos. Aún así, sería bueno saber cómo hacerlo "correctamente". – Odalrick

Respuesta

2

truco que he utilizado en el pasado con buenos resultados es escribir una consulta que devuelve SQL, a continuación, sólo copiar y pegar en la consola de comandos db. En este caso, este sería su consulta:

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; 

Esto hace uso de la práctica función de MySQL GROUP_CONCAT que agrega el valor en una CSV - perfecto para crear una lista de nombres de columna para la generación de SQL

también envuelve su consulta en un alias para que podamos seleccionar de ella.

+0

Y luego la consulta podría ejecutarse instantáneamente de acuerdo con [esta pregunta] (http://stackoverflow.com/questions/999200/is-it-possible-to-execute-a-string-in-mysql). Gracias. Todavía estoy receloso de cualquier cosa que sea similar a eval. – Odalrick

Cuestiones relacionadas