2011-09-07 12 views
5

テーブル間でデータを転送しようとしています。 'NEW'テーブルは、もともと 'OLD'テーブルに複数のエントリを持つことを意図しないデータの複数のエントリを持つことができます。私は 'OLD'テーブルからデータを取り出し、new.IDがold.OtherID new.OtherID = new.ID、newIDがnewIDと等しい新しいテーブルにコピーしたいと思います。お互い。INNER JOINまたはMINを使用して更新しますか?

'NEW' テーブル

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

更新 'NEW' テーブル上の '古い'

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

望ましい結果:

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

など

ありがとう!

を使用でき

答えて

5

これは、あなたがINNERは、MySQLでUPDATEでJOINを使用できる方法である:私は、エラー#1093を取得しています

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

サブクエリをJOINに置くと、これは他の提案よりも読みやすくなります。 – Simon

-1

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

編集:私は申し訳ありませんが、これはOLDの列に対応するすべてのレコードを更新します。

0

あなたは試すことができます:

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) 

注これは標準SQL92であり、任意のRDBMSで動作する必要があること。

+0

、あなたは、ターゲットテーブル「新しい」の更新のための句 – pfista

+1

からは指定できません。これはサブクエリの一部でもあるので、PHP(または同様の)スクリプトでそれを行う必要があるかもしれないと思っています。 –

0

これは私にとってはPostgreSQLでうまくいきましたが、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` 
関連する問題