Использование соединения в операторе слияния - программирование
Подтвердить что ты не робот

Использование соединения в операторе слияния

Проблема

Таблица 1:

| KeyColumn | DataColumn1 | DataColumn2|  
   01         0.1          0.2
   02         0.13         0.41

Таблица 2:

| anotherKey | DataColumn1 | DataColumn2|      
   A1          .15          1.2
   A2          .25          23.1

Таблица 3:

|KeyColumn| anotherKey |       
  01        A1
  02        A1

Учитывая ключ (A1 или A2), мне нужно обновить столбцы DataColumn1 и DataColumn2 в таблице 1 с соответствующими значениями в таблице 2.

Таким образом, таблица1 может обновить х строк, как показано в приведенных выше данных. Если я хочу обновить A1, обновить строки 01 и 02

(поэтому значения в таблице 1 будут равны 0,15 для datacolumn1 и 1.2 для datacolumn2 для обоих ключей 01 и 02)

Что я пробовал до сих пор:

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;

Вопросы:

  • Разрешено ли это? Использовать выбор в инструкции using? Я получаю синтаксическую ошибку в строке 1
  • Есть ли лучший способ сделать это? Я делаю это более сложным, чем это должно быть?
  • Что я делаю неправильно?

и ошибка:

Msg 102, уровень 15, состояние 1, строка 1 Неверный синтаксис рядом с 'a'. Msg 102, уровень 15, состояние 1, строка 12 Неверный синтаксис рядом с 'd'.

4b9b3361

Ответ 1

В запросе у вас появится ошибка

Msg 8156, Level 16, State 1, Line 59
The column 'AnotherKey' was specified multiple times for 'tmpTable'.

Это потому, что вы используете * в предложении use, а AnotherKey является частью как table2, так и table3.
Укажите нужные столбцы. Также нет никакого смысла иметь внешнее соединение там, поскольку вы используете keycolumn в предложении 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;

Обновление

Проводка фактической ошибки всегда полезна.

Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'a'. Msg 102, Level 15, State 1, Line 12 Incorrect syntax near 'd'.

Похоже, вы находитесь на SQL Server 2005. Слияние доступно из SQL Server 2008.

Вы можете проверить версию SQL Server с помощью select @@version.