2009-06-28 6 views
0

Cette requête SQL ne s'exécute pas. Quelqu'un peut-il donner la bonne syntaxe?Requête SQL Update

UPDATE PayrollTotals ptm 
    SET PTAmount = PTAmount + 
    (SELECT pts.PTAmount FROM PayrollTotals pts WHERE pts.PTACID = 38 
     AND pts.PTAmount > 0 
     AND pts.PTEmpID= ptm.PTEmpID) 
WHERE PTACID = 42 

Je veux mettre à jour les types 42 avec 38 types où le match PTEmpID. Aussi la somme PTAmount.

Edit: Il y aura toujours 38 et 42 rangs pour chaque PTEmpID. Donc, je veux juste ajouter 38 à 42 où PTEmpID match. Toute la table qui est.

+0

« Somme également PTAmount. » Pouvez-vous clarifier la partie de sommation? peut-être avec un exemple. – akf

Répondre

3

Trois problèmes avec cette requête:

  • S'il n'y a pas de résultats pour la sous-requête corrélative, elle retourne NULL, qui ne peuvent être ajoutés à PTAmount.
  • S'il y a plusieurs résultats pour la sous-requête, il échouera également à ajouter car une seule valeur peut être renvoyée par une sous-requête entre parenthèses.
  • Vous ne pouvez pas alias une table UPDATE à côté du mot-clé UPDATE. Vous avez besoin d'une clause FROM, après le SET, pour lui donner l'alias "ptm".

Essayez ceci:

UPDATE PayrollTotals SET PTAmount = PTAmount + 
    (SELECT SUM(pts.PTAmount) FROM PayrollTotals pts WHERE 
    pts.PTACID = 38 
    AND pts.PTAmount > 0 
    AND pts.PTEmpID = ptm.PTEmpID) 
FROM 
    PayrollTotals AS ptm 
WHERE 
    PTACID = 42 

La SOMME() veillera à ce que vous obtenez au moins un 0 résultat de la sous-requête, et s'il y a plusieurs résultats, il les somme avant de les ajouter ptm.PTAmount.

De plus, vous n'avez pas vraiment besoin de l'alias de la table. Depuis est Lissé comme pts, vous pouvez vous référer à la table mise à jour directement les PayrollTotals de la sous-requête par son nom:

UPDATE PayrollTotals SET PTAmount = PTAmount + 
    (SELECT SUM(pts.PTAmount) FROM PayrollTotals pts WHERE 
    pts.PTACID = 38 
    AND pts.PTAmount > 0 
    AND pts.PTEmpID = PayrollTotals.PTEmpID) 
WHERE 
    PTACID = 42 
+0

Cela n'exécute pas non plus ??? – Malcolm

+0

Peut-être nous donner le message d'erreur aiderait? – richardtallent

+0

Il n'aime pas la ligne 1 le "ptm" est-ce valable dans une clause de mise à jour ?? – Malcolm