J'ai deux tables, tableau A

name | amount
a    | 100
b    | 200
C    | 300

Et le tableau B comme

name  | amount
a     | 50
b     | 50
C     | 100
a     | 200

Je veux mettre à jour le tableau A et ma requête est comme ceci

UPDATE A 
   SET A.Amount += B.Amount
FROM A
INNER JOIN B ON B.Name = A.Name

Et j'espère voir

a  | 350

Mais ça revient

a | 150
0
Ali Tanha 2 sept. 2020 à 23:46

3 réponses

Meilleure réponse

Vous devez d'abord agréger b avant de rejoindre. Je recommanderais:

UPDATE A 
   SET A.Amount = A.Amount + B.Amount
FROM A JOIN
     (SELECT B.NAME, SUM(B.Amount) as Amount
      FROM B
      GROUP BY B.NAME
     ) B
     ON B.Name = A.Name;

En particulier, je le recommande vivement par rapport à la solution de sous-requête corrélée, car cette solution met à jour chaque ligne. Cela ne met à jour que les noms dans B.

Le problème avec votre requête est que plusieurs lignes correspondent à la condition JOIN. Un seul est (arbitrairement) choisi pour le UPDATE. Ceci est bien documenté dans la documentation de SQL Server.

0
Gordon Linoff 2 sept. 2020 à 22:01

Pas besoin de trop le compliquer, en supposant que vous ayez besoin de mettre à jour la table entière, utilisez simplement une sous-requête.

UPDATE A SET Amount += COALESCE((SELECT SUM(B.Amount) from B where B.[Name] = A.[NAME]),0);
0
Dale K 2 sept. 2020 à 22:37

Voici une façon ...

    update table_a
    set amount = y.amount
    from
        (
        select name, sum(amount) as amount
        from 
            (
                select name, amount
                from table_a
                union 
                select name, amount
                from table_b
            )z
        group by name
        )y
    where table_a.name = y.name
0
Isolated 2 sept. 2020 à 21:03