2009-12-11 5 views
1

J'essaie de mettre à jour ma table 1 avec une valeur de champ de la table 2 basée sur une condition. Mais je suis incapable d'obtenir la bonne requête. Voici la condition:Mise à jour d'une table avec des enregistrements d'une autre table

J'ai une table 1 avec le champ de date qui devrait être mis à jour du champ de date du tableau 2. La condition est que l'identifiant de la table 1 soit égal à id de la table 2 (le tableau 2 a l'id de la table 1 en FK). Une autre condition devrait être un champ varchar dans le tableau 2 qui devrait avoir une valeur spécifique, par exemple "Test". Partout où la valeur du champ dans le tableau 2 est "Test", je veux mettre à jour la date de cet enregistrement dans le champ date du tableau 1. Mais il y a une autre prise. Il est possible que plus de 1 enregistrements pour même ID dans le tableau 2 peuvent avoir une valeur comme « Test »

je tentais la requête comme:

UPDATE A 
SET A.Date = Max(B.[Date]) 
FROM Table1 A 
INNER JOIN Table2 B ON A.ID = B.FK_ID 
WHERE (B.Changed LIKE 'Test') 
AND A.Date IS NULL 

Mais cela ne fonctionne pas comme SQL ne permet pas Max dans la mise à jour lorsqu'il n'y a pas de groupe par. S'il vous plaît aider. Un peu urgent.

Répondre

2

Vous devez créer une autre de jointure interne où les d'identité du Tableau 1 sont couplées avec les dates maximales de Tableau2 comme si:

UPDATE Table1 
SET  Date = BDate.MaxDate 
FROM  Table1 A 
      INNER JOIN Table2 B ON A.ID = b.FK_ID 
      INNER JOIN (
       SELECT A.ID, [MaxDate] = MAX(B.Date) 
       FROM  Table1 A 
         INNER JOIN Table2 B ON A.ID = b.FK_ID 
       GROUP BY A.ID 
     ) BDate ON BDate.ID = A.ID 
WHERE  B.Changed LIKE 'Test' 
      A.Date IS NULL 
1

Vous pouvez toujours utiliser les sous-requêtes:

UPDATE Table1 a SET 
    [Date] = (SELECT MAX([Date]) FROM Table2 b WHERE a.ID = b.FK_ID AND b.Changed LIKE 'Test') 
WHERE [Date] IS NULL 
+0

semble correcte, mais pourquoi utiliser LIKE au lieu d'égal? –

+0

ma première impulsion était de l'éditer pour égaler, mais ensuite j'ai pensé que 'Test' était si évidemment un exemple de valeur inventée, donc je suppose qu'il pourrait être considéré comme lu que quelque chose d'autre va effectivement y aller dans l'implémentation en direct de cette , et à partir de là, j'ai juste supposé que Ted connaissait les différences entre 'LIKE' et' = 'et a décidé de ne pas choisir, car il était plutôt périphérique à la question =) –

+0

Bananes cool, voulait s'assurer que j'avais 't manqué sur un changement de syntaxe aléatoire –