2010-05-02 17 views
5

Usando la respuesta de esta pregunta: Need MySQL INSERT - SELECT query for tables with millions of recordsMySQL en duplicado actualización de clave + sub consulta

new_table 
    * date 
    * record_id (pk) 
    * data_field 


INSERT INTO new_table (date,record_id,data_field) 
    SELECT date, record_id, data_field FROM old_table 
     ON DUPLICATE KEY UPDATE date=old_table.data, data_field=old_table.data_field; 

necesito esto para trabajar con un grupo de unirte .. así a editar:

INSERT INTO new_table (date,record_id,data_field,value) 
    SELECT date, record_id, data_field, SUM(other_table.value) as value FROM old_table JOIN other_table USING(record_id) GROUP BY record_id 
     ON DUPLICATE KEY UPDATE date=old_table.data, data_field=old_table.data_field, value = value; 

Parece que no puedo actualizar el valor. Si especifico old_table.value obtengo un error de lista de campo no definido.

Respuesta

3

Mientras buscaba algo más, encontré una pregunta relacionada: "MySQL ON DUPLICATE KEY UPDATE with nullable column in unique key".

La respuesta es que VALUES() se puede usar para referirse a la columna "valor" en la sub consulta seleccionada.

+0

exactamente, ese es el problema – newtover

+1

VALUES() no funciona en mi versión de mysql (5.1.32). Tuve que usar el truco en mi respuesta a continuación. Seguro que me gustaría que VALUES() funcione, es mucho más elegante. – Justin

6

por los documentos en http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

En la parte de los valores EN DUPLICADO KEY UPDATE, puede hacer referencia a columnas de otras tablas, siempre y cuando no se utiliza GROUP BY en la parte SELECT. Un efecto secundario es que debe calificar nombres de columnas no únicas en la parte de valores.

Por lo tanto, no puede usar la consulta de selección porque tiene un grupo por declaración. Necesitas usar este truco en su lugar. Básicamente, esto crea una tabla derivada para su consulta. Puede que no sea increíblemente eficiente, pero funciona.

INSERT INTO new_table (date,record_id,data_field,value) 
    SELECT date, record_id, data_field, value 
    FROM (
     SELECT date, record_id, data_field, SUM(other_table.value) as value 
     FROM old_table 
     JOIN other_table 
     USING(record_id) 
     GROUP BY record_id 
    ) real_query 
ON DUPLICATE KEY 
    UPDATE date=real_query.date, data_field=real_query.data_field, value = real_query.value; 
+0

Gracias Justin. Has guardado nuestro escondite en [aquí] (http://stackoverflow.com/q/38050762) – Drew

Cuestiones relacionadas