2011-09-07 18 views
5

Estoy tratando de transferir algunos datos entre tablas. La tabla 'NUEVA' puede tener múltiples entradas de los datos que originalmente no estaban destinados a tener múltiples entradas en la tabla 'ANTIGUO'. Me gustaría tomar los datos de la tabla 'OLD' y copiarlos a la nueva tabla donde NEW.ID es el más bajo donde new.OtherID = old.OtherID, básicamente un MIN (ID) por grupo de OtherID igual a El uno al otro.¿ACTUALIZAR con INNER JOIN o MIN?

'NUEVO' mesa

ID | OtherID | Data 
1  1  NULL 
2  1  NULL 
3  2  NULL 
4  3  NULL 
5  3  NULL 

'viejo'

OtherID | Data <br> 
1   data1 
2   data2 
3   data3 
4   data4 
5   data5 

resultado deseado en la tabla actualizada 'NUEVO':

ID | OtherID | Data <br> 
1  1  data1 
2  1  NULL 
3  2  data2 
4  3  data3 
5  3  NULL 

etc

Gracias!

Respuesta

5

Esta es la forma en que podría utilizar INNER JOIN con UPDATE en MySQL:

UPDATE NEW n 
    INNER JOIN (
    SELECT 
     OtherID, 
     MIN(ID) AS ID 
    FROM NEW 
    GROUP BY OtherID 
) m ON n.ID = m.ID 
    INNER JOIN OLD o ON n.OtherID = o.OtherID 
SET n.Data = o.Data 
+0

Al poner la subconsulta en JOIN, esto es mucho más legible que las otras sugerencias. – Simon

-1

Se puede utilizar:

UPDATE `NEW` 
LEFT JOIN `OLD` 
    ON `NEW`.`OtherID` = `OLD`.`ID` 
SET `NEW`.`Data` = `OLD`.`Data` 

EDIT: Lo siento, esto actualizará todos los registros que corresponden a las columnas en el Viejo.

0

Usted puede tratar de:

UPDATE new 
    SET Data = (SELECT DATA FROM old WHERE otherID = new.otherID) 
WHERE NOT EXIST 
     (SELECT NULL FROM new AS new2 
      WHERE new2.id < new.id 
      AND new2.otherID = new.otherID) 

Tenga en cuenta que esto es SQL92 estándar y debería funcionar con cualquier RDBMS.

+0

estoy recibiendo el error # 1093, no se puede especificar la tabla de destino 'nuevo' para la actualización de cláusula de – pfista

+1

Eso es porque también es parte de una subconsulta, estoy empezando a pensar que puede necesitar hacerlo en un script PHP (o similar) ... –

0

Esto funcionó para mí en PostgreSQL, aunque es posible que haya obtenido las citas incorrectas para MySQL.

UPDATE newtable SET 
`Data` = oldtable.`Data` 
FROM 
oldtable 
WHERE 
newtable.`ID` IN (
    SELECT MIN(sub_newtable.`ID`) 
    FROM newtable sub_newtable 
    GROUP BY 
    sub_newtable.`OtherID` 
) 
AND newtable.`OtherID` = oldtable.`OtherID`