2009-11-18 11 views
0

Compte tenu deux tables A et B dans une base de données MySQL, comment peut-on mettre à jour un champ dans une ligne du tableau A si et uniquement si certains champs de la ligne mentionnée dans le tableau A correspondent exactement aux champs d'une ligne distincte de la table B. Les lignes de la table B doivent être utilisées une seule fois et une seule fois pour chaque comparaison. En tant que tel, une ligne dans le tableau B qui a des champs correspondant à une ligne dans le tableau A ne peut pas être utilisé un gain pour correspondre à toute autre ligne du tableau A.Comment puis-je faire correspondre trois champs de deux tables afin de mettre à jour les mêmes tables en cas de correspondance

J'ai essayé

UPDATE 
    Table A, 
    Table B 
SET 
    Table A.Status = 'MATCHED', 
     Table B.Status = 'USED' 
WHERE 
    Table B.Status IS NULL 
AND 
    Table A.Field1 = Table B.Field1 
AND 
    Table A.Field2 = Table B.Field2 

Malheureusement, cela ne ne pas donner mes résultats souhaités puisque les différentes lignes du tableau A ont tendance à être jumelé avec la même ligne dans le tableau B.

par exemple: Tableau A

ID Date  Ref Amount Status 
1 2009-10-20 773 300000   
2 2009-10-20 773 10000 MATCHED 
3 2009-10-20 773 150000   
4 2009-10-20 773 20000 MATCHED 
5 2009-10-20 773 140000 MATCHED 

Tableau B

Ref Amount Date  ID 
870 50000 2009-11-01 1 
871 50000 2009-11-01 2 
871 80000 2009-11-01 3 
871 20000 2009-11-01 4 
871 20000 2009-11-01 5 
871 20000 2009-11-01 6 
872 300000 2009-11-01 7 

Pour correspondre à l'aide de Ref, Montant et Date.

+0

Pourriez-vous s'il vous plaît fournir des exemples de données? Cela pourrait aider les autres à répondre à votre question. –

+1

À première vue, il semble que vous ayez besoin d'une jointure ... cependant, certains exemples de données montrant des résultats souhaités et incorrects vous aideraient. –

+0

Terminé. maintenant s'il vous plaît signer NDA :) – jake

Répondre

1

Pourrait-il être aussi simple que d'ajouter des exclusions à la clause WHERE pour éviter la réutilisation?

AND Table A.Status <> 'MATCHED' 
AND Table B.Status <> 'USED' 

Cela fonctionnera si chaque ligne est mise à jour à tour de rôle, mais pas si elle est basée et transactionnelle. Mes excuses pour ne pas avoir testé cela; Je n'ai pas MySQL ici pour essayer ça.

+0

Désolé pour le retard. C'est la meilleure réponse à ce problème particulier. – jake

1

Ajouter plus de conditions à votre clause WHERE pour forcer une correspondance 1: 1 entre les enregistrements de tableA et tableB?

+0

pouvez-vous suggérer les conditions supplémentaires s'il vous plaît? – jake