2015-06-06 62 views
0

已使用多年的舊數據庫最終已到達該階段,需要將其退役並替換爲更適合業務需求的一個數據庫正在被使用。在可能的情況下,新的數據庫被設計成儘可能無痛地將現有數據從舊數據庫轉移到新數據庫。然而,有一些表格需要在初始數據傳輸(或至少所有簡單的位置)發生後執行一些更新。使用從其他表中收集的信息更新表中的每一行

在SQL中的基本更新語句我很熟悉,但遍歷整個表,我沒有做過,我不知道最有效的方法來解決它。

舉例說明我想做什麼。假設表A現在有幾個字段比它的原始字段更多。這些附加字段中的許多將包含cab從數據庫中的其他表派生的信息。因此,表A現在有一個字段,它需要包含表B中兩個字段中包含的信息。我想要遍歷表a中的每一行,並將字段x設置爲等於來自表b的字段c & d的級聯其中表b的標識字段等於表a的字段y中的值。在僞sql類似的,

For each row in table a 
set field x = (select field c + field d from table b where id = field y) 
next row 

有大約8500行來貫穿。每行在字段y中都有一個有效的條目,而表b中的id在它的id字段中與這些字段相匹配,所以實際上,這只是最有效的一種類型的sql語句來完成這種類型的事情。

感謝您的任何建議,你可能有。

回答

0

除非我在你的問題中遺漏了一些東西,這聽起來像你想做一個簡單的連接更新,可以作爲基於集的操作來完成,因此不需要使用循環。如果是這樣的話,那麼這個查詢應該是你想要什麼:

UPDATE a 
SET a.x = CONCAT(b.c, b.d) -- possibly CONCAT(b.c, ' ', b.d) if you want a separator 
FROM TableA a 
JOIN TableB b ON a.y = b.id 
+1

謝謝,作品很好 –

0

給你描述,我建議採用一套基於更新的條件,從我的經驗,這將是最快的國家之一。我儘可能使用基於集合的操作,而不是像使用遊標或某個迭代循環那樣。

你可以看看this discussion關於基於集合的操作與單獨處理行。

相關問題