2011-09-12 4 views
-1

TableASQL: Mise à jour une colonne basée sur autre table

ID MatchID1 MatchID2 
1 1002 120 
3 1003 141 
5 1006 150 
6 1008 140 

TableB

ID MatchID1 MatchID2 Status 
1 1002  120 
2 1002  120 
3 1002  120 
4 1003  200 
5 1006  150 
6 1008  150 
7 1008  140 

Je veux remplir TableB col = statut avec 'FAIL' si: ALL matchID2 pour son MatchID1 de tableB n'est pas égal au matchID2 pour son MAatchID1 correspondant dans la tableA Dans ce cas, la tableB: 120 correspond à 1002, c'est la même chose pour la tableA, donc pas d'échec. Résultat attendu:

ID MatchID1 MatchID2 Status 
    1 1002  120 NULL 
    2 1002  120 NULL 
    3 1002  120 NULL 
    4 1003  200 FAIL 
    5 1006  150 NULL 
    6 1008  150 FAIL 
    7 1008  140 FAIL 

Note: Si même un enregistrement (match02) ne correspond pas à, ne parviennent ensemble tout pour match01. comme pour id 6 & 7 dans la tableB. Merci d'avance.

+0

Si vous utilisez Oracle, vous pouvez le faire avec une seule procédure. Avec seulement SQL je ne peux pas vous assurer que vous pouvez le faire. –

Répondre

1
UPDATE a 
SET Status = 'FAIL' 
FROM TableA a 
    INNER JOIN (
    SELECT a.MatchID1 
    FROM TableA a 
     INNER JOIN b ON a.MatchID1 = b.MatchID1 AND a.MatchID2 <> b.MatchID2 
    GROUP BY a.MatchID1 
) x ON a.MatchID1 = x.MatchID1 
0

Je pense que vous cherchez une mise à jour via une jointure. Essaye ça; Vous n'avez pas indiqué quel SGBDR vous utilisez, ce qui est indiqué ci-dessus concerne SQL Serveur.

0

re-lecture .. Je ne sais toujours pas ce que vous avez demandé ...

suggèrent briser vos efforts en petits morceaux.

il vous semble besoin de plusieurs choses:

  1. une petite requête pour obtenir seulement les lignes de la première table que faire ou n'ont pas un numéro de match. écris ça.

  2. une petite requête pour trouver si le numéro de correspondance de la seconde table est trouvé dans la première table. écris ça.

  3. une mise à jour qui définit des valeurs basées sur les deux premières requêtes.

HTH

1
update B 
    set status = 'FAIL' 
    From tableB B 
    INNER JOIN (SELECT B.matchID1 FROM TableB B 
       GROUP BY B.matchID1 
       HAVING MAX(matchID1)<> MIN(MatchID2)) B1 
    ON B.matchid1 = B1.MatchID1 

UPDATE B 
SET Status = 'FAIL' 
FROM TableB B 
    INNER JOIN TableA A 
    ON A.MatchID1 = B.matchID1 
WHERE A.matchID2 <> B.matchID2 
Questions connexes