2017-08-30 1 views
0

J'essaie de fusionner des données d'une table à une autre.Mise à jour d'une table d'une autre table avec des clés dupliquées

Tableau 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 

Tableau 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 

Je cherche à cartographier colonne col4 de la table Tab2 dans la colonne col_to_update dans le tableau Tab1 basé sur l'appariement Tab1.col2 = Tab2.col2 et Tabl.col3 = Tab2.col3 pour obtenir ci-dessous sortie attendue:

Sortie attendue

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 

J'ai essayé, sans succès, avec ci-dessous requête:

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; 

Y at-il un moyen d'obtenir le résultat attendu.

+2

Cela n'a pas de sens: dans le tableau que vous avez plus d'un candidat « source » pour la valeur qui doit être utilisé pour la mise à jour. Quels sont les candidats potentiels à utiliser? Dans votre exemple, pour ID = 1, pourquoi avez-vous choisi v1 et non v2 à partir de Tab2? – mathguy

+0

oui Tab2 a plusieurs correspondances potentielles, je m'attends à mapper le premier ou un qui correspond. – Brij

+0

"le premier" est indéfini - y a-t-il une commande? Ou voulez-vous dire la valeur min? Thorsten a déjà montré comment faire ça. – mathguy

Répondre

1

Vous voulez simplement mise à jourtab1:

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

Pourquoi pensez-vous que cela fonctionnera? Avez-vous lu la question? ** Vraiment ** le lire? – mathguy

+0

@mathguy: vous avez bien sûr raison. La requête est incomplète, et comme il peut y avoir plusieurs correspondances, nous avons besoin d'une règle pour déterminer la valeur à définir. C'est à dire. 'select min (tab2.col4)'. J'ai mis à jour ma réponse en conséquence. –