2017-08-30 38 views
0

我試圖將數據從一個表合併到另一個表中。使用重複密鑰從另一個表中更新一個表

表1(TAB1)

ID col2 col3 col_to_update 
1 s1  a1  null 
2 s1  a2  null 
3 s1  a2  null 
4 s2  a1  null 
5 s3  a1  null 
6 s4  a1  null 

表2(TAB2)

ID col2 col3 col4 
10 s1  a1  v1 
11 s1  a1  v2 
12 s1  a2  v3 
13 s2  a1  v4 
14 s3  a1  v5 
15 s4  a1  v6 
16 s4  a1  v7 

我試圖基於匹配Tab1.col2 = Tab2.col2Tabl.col3 = Tab2.col3在表Tab1從表Tab2映射列col4col_to_update柱以低於預期輸出:

預期輸出

ID col2 col3 col4 
1 s1  a1  v1 
2 s1  a2  v3 
3 s1  a2  v3 
4 s2  a1  v4 
5 s3  a1  v5 
6 s4  a1  v6 

我下面的查詢失敗嘗試:

MERGE INTO Tab1 x1 
USING 
(
    SELECT t1.id as t1id, t2.id as t2id, t2.col2 t2col2, t2.col3 t2col3, t2.col4 from Tab2 t2 
    JOIN Tab1 t1 ON t2.col2 = t1.col2 AND t2.col3 = t1.col3 
) x2 
ON (x1.id = x2.t1id) 
WHEN MATCHED THEN UPDATE SET 
x1.col_to_update = x2.col4; 

是否有一種方式來獲得預期的輸出。

+2

這沒有任何意義:在「源」表中,您對應該用於更新的價值多於一名候選人。應該使用哪些候選人?在你的例子中,對於ID = 1,你爲什麼從Tab2中選擇v1而不是v2? – mathguy

+0

是Tab2有多個潛在匹配項,我期望映射第一個或任何匹配的匹配項。 – Brij

+0

「第一個」未定義 - 是否有訂單?或者你的意思是最小值? Thorsten已經展示瞭如何做到這一點。 – mathguy

回答

1

你只是想更新tab1

update tab1 
set col_to_update = 
(
    select min(tab2.col4) -- or whichever value you want to use 
    from tab2 
    where tab2.col2 = tab1.col2 
    and tab2.col3 = tab1.col3 
); 
+0

你爲什麼認爲這會起作用?你讀過這個問題了嗎? **真的**讀過嗎? – mathguy

+0

@mathguy:你當然是對的。請求不完整,並且由於可能有多個匹配項,我們需要一個規則來確定要設置的值。即'select min(tab2.col4)'。我相應地更新了我的答案。 –