sql-server - tables - update value inner join




Mettre à jour une table en utilisant JOIN dans SQL Server? (6)

Essayer:

UPDATE table1
SET CalculatedColumn = ( SELECT [Calculated Column] 
                         FROM table2 
                         WHERE table1.commonfield = [common field])
WHERE  BatchNO = '110'

Je veux mettre à jour une colonne dans une table en faisant une jointure sur une autre table, par exemple:

UPDATE table1 a 
INNER JOIN table2 b ON a.commonfield = b.[common field] 
SET a.CalculatedColumn= b.[Calculated Column]
WHERE 
    b.[common field]= a.commonfield
AND a.BatchNO = '110'

Mais il se plaint:

Msg 170, niveau 15, état 1, ligne 2
Ligne 2: syntaxe incorrecte près de 'a'.

Quel est le problème ici?


Essayez-le comme ceci:

begin tran
    UPDATE a 
    SET a.CalculatedColumn= b.[Calculated Column]
    FROM table1 a INNER JOIN table2 b ON a.commonfield = b.[common field] 
    WHERE a.BatchNO = '110'
commit tran

(edit: dy fautes de frappe!)


On dirait que SQL Server 2012 peut aussi gérer l'ancienne syntaxe de mise à jour de Teradata:

UPDATE a
SET a.CalculatedColumn= b.[Calculated Column]
FROM table1 a, table2 b 
WHERE 
    b.[common field]= a.commonfield
AND a.BatchNO = '110'

Si je me souviens bien, 2008R2 donnait une erreur quand j'ai essayé une requête similaire.


Réponse donnée ci-dessus par Aaron est parfait:

UPDATE a
  SET a.CalculatedColumn = b.[Calculated Column]
  FROM Table1 AS a
  INNER JOIN Table2 AS b
  ON a.CommonField = b.[Common Field]
  WHERE a.BatchNo = '110';

Juste vouloir ajouter pourquoi ce problème se produit dans SQL Server lorsque nous essayons d'utiliser l'alias d'une table lors de la mise à jour de cette table, la syntaxe mentionnée ci-dessous donnera toujours une erreur:

update tableName t 
set t.name = 'books new' 
where t.id = 1

case peut être any si vous mettez à jour une seule table ou si vous mettez à jour en utilisant join.

Bien que la requête ci-dessus fonctionne correctement dans PL / SQL mais pas dans SQL Server.

Le moyen correct de mettre à jour une table en utilisant l'alias de table dans SQL Server est:

update t 
set t.name = 'books new' 
from tableName t 
where t.id = 1

J'espère que cela aidera tout le monde pourquoi l'erreur est venue ici.


Vous n'avez pas tout à fait la syntaxe UPDATE FROM propriétaire de SQL Server vers le bas. Vous ne savez pas non plus pourquoi vous avez dû vous joindre à CommonField et y filtrer ensuite. Essaye ça:

UPDATE t1
  SET t1.CalculatedColumn = t2.[Calculated Column]
  FROM dbo.Table1 AS t1
  INNER JOIN dbo.Table2 AS t2
  ON t1.CommonField = t2.[Common Field]
  WHERE t1.BatchNo = '110';

Si vous faites quelque chose de vraiment bête - comme essayer constamment de définir la valeur d'une colonne à l'agrégat d'une autre colonne (ce qui viole le principe d'éviter de stocker des données redondantes), vous pouvez utiliser une CTE (expression de table commune) :

;WITH t2 AS
(
  SELECT [key], CalculatedColumn = SUM(some_column)
    FROM dbo.table2
    GROUP BY [key]
)
UPDATE t1
  SET t1.CalculatedColumn = t2.CalculatedColumn
  FROM dbo.table1 AS t1
  INNER JOIN t2
  ON t1.[key] = t2.[key];

La raison pour laquelle c'est vraiment idiot, c'est que vous allez devoir relancer toute cette mise à jour à chaque fois qu'une ligne de table2 change. Une SUM est quelque chose que vous pouvez toujours calculer à l'exécution et, ce faisant, ne jamais avoir à vous inquiéter que le résultat soit périmé.






sql-update