2012-05-04 26 views
0

在Oracle中,我有兩個表。兩者都填入數據並有timestamp列。如何根據來自另一個表的id匹配在一個表中填充列數據(使用匹配表中的數據)

一張表的那一列填充了數據,另一張表沒有。但是我需要根據另一列的匹配將表中的數據從另一個表的列中移入另一個表的列中。

每個代碼都有'代碼',所以只能將一個表的時間戳放在代碼匹配的另一個表的時間戳中。

我已經嘗試過遊標等,但它似乎像我失去了一些東西。

有什麼建議嗎?

+0

是'code'一個主鍵或唯一源表中的列? – Neil

+0

這不是主鍵,它是可以空的,我敢肯定它不是唯一的 – 1Canuck16

+0

那麼當兩個代碼匹配時你會怎麼做? – Neil

回答

2

這聽起來像你想要一個相關的更新。這將更新destinationTable的每一行,timestamp_colsourceTable更新,其中code列有匹配項。

UPDATE destinationTable d 
    SET timestamp_col = (SELECT s.timestamp_col 
          FROM sourceTable s 
         WHERE s.code = d.code) 
WHERE EXISTS(SELECT 1 
       FROM sourceTable s 
       WHERE s.code = d.code) 
+2

這很可能會失敗,因爲代碼列可能包含重複項(請參閱問題的評論)。你可能需要在子選擇中使用'max(s.timestamp_col)'或類似的東西。 –

+0

這似乎是要走的路......但我們正在處理大約3000萬行......所以我們要做一些其他的東西來加速它......首先考慮到這個數字......做你還有其他建議嗎? – 1Canuck16

+1

@redBarron - 一條'UPDATE'語句將是更新大量行的最有效方式。正如@Neil和@a_horse_with_no_name指出的那樣,如果可以有多個具有相同'code'的行,則需要指定其他條件來確定源表中哪一行用於更新目標中的任何特定行表(可能用'max(s.timestamp_col)')。 –

1

只是爲了保持完整性,我想我會做這樣的事情(未經測試),如果目標有一個主鍵或唯一列:

UPDATE (
    SELECT d.primary_key AS pk, d.timestamp_col AS dest_col, MAX(s.timestamp_col) AS src_col 
    FROM dest d 
    JOIN src s ON d.code = s.code 
    GROUP BY pk, dest_col 
) j 
    SET j.dest_col = j.src_col 
相關問題