2015-04-23 89 views
1

我正在處理兩列中的數據已損壞的1000+行表(table_corrupted)。幸運的是,我有一張過時的備份表,其中這兩列完好無損(table_outdated)。所以我想:爲什麼不只是替換這兩列中的值,而保持原樣?將值從一個表複製到另一個表中相同的ID

比方說table_corrupted & table_outdated都有5列:

id(INT),name(文本),lat(雙),lon(雙),comment(文本)

insert into `table_corrupted` (`lat`,`lon`) 
select `lat`,`lon` from `table_outdated` 
WHERE `table_corrupted`.`id` = `table_outdated`.`id`; 

。此錯誤的結果:「未知列'table_corrupted.id'In Where子句」

經過一番研究後,我發現這是因爲SQL是從右向左評估的。說實話,我沒有找出解決方案 - 任何建議?我究竟做錯了什麼?

+0

你有誤診這一點。嘗試查詢UPDATE語句(這些可以讓您更改現有行中的現有值,而不是插入新行)。 – MatBailie

+0

你完全正確,MatBailie!我很愚蠢:-p – Jonas

回答

3

您可以更好地聯接表,只需通過執行以下查詢

update `table_corrupted` 
inner join `table_outdated` on `table_corrupted`.`id` = `table_outdated`.`id` 
set `table_corrupted`.`lat`= `table_outdated`.`lat`, 
`table_corrupted`.`lon`= `table_outdated`.`lon` 
+0

其實,他需要更新聲明 – MatBailie

+0

@MatBailie: - 是的,這似乎是正確的。更新了我的答案! –

1

不使用INSERT,UPDATE,在損壞的表中的值。使用更新。這一個爲我工作。

UPDATE `table_corrupted` INNER JOIN `table_corrupted` ON (`table_corrupted`.`id` = `table_outdated`.`id`) 
SET `table_corrupted`.`lat` = `table_outdated`.`lat`, `table_corrupted`.`lon` = `table_outdated`.`lon` 
+0

不適用於我:**不是唯一的表/別名:table_corrupted ** - 即使在使用數據庫名稱後也是如此。但是Rahul Tripathi無論如何都解決了它。非常感謝您的快速解答! – Jonas

+0

這是爲我工作。謝謝 –

1

您可以使用重複:

insert into `table_corrupted` (`id`,`lat`,`lon`) 

    select `id`,`lat`,`lon` from `table_outdated` 
    on duplicate key update table_corrupted.lat = table_outdated.lat, table_corrupted.lon = table_outdated.lon 

或更新:

update table_corrupted,table_outdated 
set table_corrupted.lat = table_outdated.lat, table_corrupted.lon = table_outdated.lon 
where table_corrupted.id = table_outdated.id 
相關問題