Vous n'avez pas tout à fait la UPDATE FROM
syntaxe propriétaire de SQL Server vers le bas. Je ne sais pas non plus pourquoi vous deviez vous connecter sur le CommonField
filtre et le 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 stupide - comme essayer constamment de définir la valeur d'une colonne sur l'agrégat d'une autre colonne (ce qui viole le principe d'éviter de stocker des données redondantes), vous pouvez utiliser un CTE (expression de table commune) - voir ici et ici pour plus de détails:
;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 cela est vraiment stupide, c'est que vous devrez réexécuter cette mise à jour entière à chaque fois que vous modifiez une ligne table2
. A SUM
est quelque chose que vous pouvez toujours calculer au moment de l'exécution et, ce faisant, ne vous inquiétez jamais que le résultat soit périmé.
UPDATE table1 a SET a.[field] = b.[field]
- supprimer l'alias a fonctionne, doncUPDATE table1 a SET [field] = b.[field]
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
.Essayez-le comme ceci:
la source
La réponse donnée ci-dessus par Aaron est parfaite:
Je veux juste 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 de mention ci-dessous donnera toujours une erreur:
la casse peut être quelconque si vous mettez à jour une seule table ou si vous mettez à jour en utilisant join.
Bien que la requête ci-dessus fonctionne correctement en PL / SQL mais pas dans SQL Server.
La façon correcte de mettre à jour une table tout en utilisant l'alias de table dans SQL Server est:
J'espère que cela aidera tout le monde pourquoi l'erreur est venue ici.
la source
la source
Il semble que SQL Server 2012 puisse également gérer l'ancienne syntaxe de mise à jour de Teradata:
Si je me souviens bien, 2008R2 donnait une erreur lorsque j'ai essayé une requête similaire.
la source
Je trouve utile de transformer un UPDATE en un SELECT pour obtenir les lignes que je veux mettre à jour en tant que test avant la mise à jour. Si je peux sélectionner les lignes exactes que je veux, je peux mettre à jour uniquement les lignes que je veux mettre à jour.
la source
Plus d'alternatives ici .
la source
Une autre approche consisterait à utiliser MERGE
-Merge fait partie de la norme SQL
-Je suis également sûr que les mises à jour des jointures internes ne sont pas déterministes .. Question similaire ici où la réponse en parle http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query. html
la source
MERGE
.J'ai eu le même problème .. et vous n'avez pas besoin d'ajouter une colonne physique .. cuz maintenant vous devrez la maintenir .. ce que vous pouvez faire est d'ajouter une colonne générique dans la requête de sélection:
EX:
la source
L'approche d'Aaron ci-dessus a parfaitement fonctionné pour moi. Mon instruction de mise à jour était légèrement différente car j'avais besoin de me joindre sur la base de deux champs concaténés dans une table pour correspondre à un champ dans une autre table.
la source
Essayer:
la source
table1
, pas seulement les lignes où il y a une correspondance sur le champ commun entre les deux tables (en fait une jointure gauche et non une jointure interne).BatchNo = '110'
, non? Est-ce que tous les votes négatifs sont le résultat de cet effet, ou est-ce que d'autres avaient d'autres raisons de voter contre?NULL
, et ce formulaire peut être une solution moins spécifique à T-SQL.