2011-09-07 15 views
5

Sto provando a trasferire alcuni dati tra le tabelle. La tabella 'NOVITÀ' può avere più voci dei dati che originariamente non intendevano avere più voci nella tabella 'OLD'. Vorrei prendere i dati dalla tabella 'OLD' e copiarli nella nuova tabella in cui NEW.ID è il più basso dove new.OtherID = old.OtherID, in pratica un MIN (ID) per gruppo di OtherID uguale a l'un l'altro.AGGIORNAMENTO con INNER JOIN o MIN?

'NUOVO' tavolo

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

'VECCHIO'

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

risultato desiderato sul tavolo aggiornato 'NOVITA':

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

ecc

Grazie!

risposta

5

questo è come si potrebbe usare INNER JOIN con UPDATE in 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

Mettere la sottoquery nel JOIN rende questo molto più leggibile rispetto agli altri suggerimenti. – Simon

-1

È possibile utilizzare:

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

EDIT: Mi dispiace, questo aggiornerà tutti i record che corrispondono alle colonne in OLD.

0

Si può provare:

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) 

notare che questa è SQL92 standard dovrebbe funzionare con qualsiasi RDBMS.

+0

sto ottenendo l'errore # 1093, non è possibile specificare tabella di destinazione 'nuovo' per l'aggiornamento nella clausola FROM – pfista

+1

Questo perché è anche parte di una sottoquery, sto iniziando a pensare che potrebbe essere necessario farlo in uno script PHP (o simile) ... –

0

Questo ha funzionato per me in PostgreSQL, anche se potrei aver ottenuto il quoting sbagliato per 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`