2011-09-07 55 views
5

我正試圖在表格之間傳輸一些數據。 '新'表可以有多個數據條目,最初並不打算在'OLD'表中有多個條目。我想從「OLD」表中獲取數據並將其複製到新表中,其中NEW.ID是new.OtherID = old.OtherID中最低的一個表,每個OtherID的基本MIN(ID)等於彼此。更新INNER JOIN或MIN?

'NEW' 表

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

'老'

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與UPDATE在MySQL JOIN:在

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

我得到錯誤#1093,您不能指定目標表「新」的更新FROM子句 – 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`