Problème
Tableau 1:
| KeyColumn | DataColumn1 | DataColumn2|
01 0.1 0.2
02 0.13 0.41
Tableau 2:
| anotherKey | DataColumn1 | DataColumn2|
A1 .15 1.2
A2 .25 23.1
Tableau 3:
|KeyColumn| anotherKey |
01 A1
02 A1
Étant donné une clé (A1 ou A2), je dois mettre à jour les colonnes DataColumn1 et DataColumn2 dans le tableau 1 avec les valeurs correspondantes dans le tableau 2.
Ainsi, table1 peut avoir x nombre de lignes mises à jour, comme indiqué dans les données ci-dessus. Si je veux mettre à jour A1, les lignes 01 et 02 doivent être mises à jour
(les valeurs du tableau 1 seraient donc de 0,15 pour datacolumn1 et de 1,2 pour datacolumn2 sur les deux clés 01 et 02)
Ce que j'ai essayé jusqu'à présent:
MERGE table1
USING (SELECT *
FROM table2
LEFT OUTER JOIN table3
on table2.anotherKey = table3.anotherKey
WHERE table2.anotherKey = 'A1') tmpTable
ON
table1.keyColumn = tmpTable.keyColumn
WHEN MATCHED THEN
UPDATE
SET table1.DataColumn1 = tmpTable.DataColumn1
,table1.DataColumn2 = tmpTable.DataColumn2;
Questions:
et l'erreur:
Msg 102, niveau 15, état 1, ligne 1 Syntaxe incorrecte près de "a". Msg 102, niveau 15, état 1, ligne 12 Syntaxe incorrecte près de "d".
La requête que vous avez donnera l'erreur
Msg 8156, Level 16, State 1, Line 59
The column 'AnotherKey' was specified multiple times for 'tmpTable'.
C'est parce que vous utilisez *
dans la clause using et AnotherKey
fait partie des deux table2
et table3
.
Spécifiez les colonnes dont vous avez besoin. De plus, il n'y a aucune utilité à y avoir une jointure externe puisque vous utilisez keycolumn
dans la clause on
.
MERGE table1
USING (SELECT table3.keycolumn,
table2.DataColumn1,
table2.DataColumn2
FROM table2
INNER JOIN table3
ON table2.anotherKey = table3.anotherKey
WHERE table2.anotherKey = 'A1') tmpTable
ON
table1.keyColumn = tmpTable.keyColumn
WHEN MATCHED THEN
UPDATE
SET table1.DataColumn1 = tmpTable.DataColumn1
,table1.DataColumn2 = tmpTable.DataColumn2;
Mise à jour
La publication de l'erreur réelle est toujours utile.
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'a'. Msg 102, Level 15, State 1, Line 12 Incorrect syntax near 'd'.
Il semble que vous soyez sur SQL Server 2005. La fusion est disponible depuis SQL Server 2008 .
Vous pouvez vérifier votre version de SQL Server avec select @@version
.