web-dev-qa-db-fra.com

Utilisation d'une jointure dans une instruction de fusion

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:

  1. Est-ce permis? Pour utiliser la sélection dans l'instruction using? Je reçois une erreur de syntaxe sur la ligne 1
  2. Y a-t-il une meilleure façon de procéder? Suis-je en train de rendre cela plus compliqué qu'il ne doit l'être?
  3. Qu'est-ce que je fais mal?

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".

22
Steve's a 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.

32
Mikael Eriksson