ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ в MERGE

Существует таблица, в которой необходимо исправить значения в нескольких столбцах. Затем идет таблица, содержащая все значения, которые необходимо исправить.

Есть ли простой способ использовать CROSS APPLY в инструкции MERGE?

С моими текущими знаниями мне нужно будет запустить следующий код для столбца1, столбца2 и так далее.

MERGE INTO target_table AS t
USING source_table AS s
ON t.key_column = s.key_column
    AND 'column_1' = s.correction_column
WHEN MATCHED THEN  
UPDATE SET t.column_1 = s.correction_value;

РЕДАКТИРОВАТЬ: Это игрушечные примеры цели, источника и ожидаемого результата.

Цель:

##    |  uid | col_1 | col_2 | col_3 | col_4 | col_5
----------------------------------------------------
## 1  |    1 |     a |     a |     a |     a |     a
## 2  |    2 |     a |     a |     a |     a |     a
## 3  |    3 |     a |     a |     a |     a |     a
## 4  |    4 |     a |     a |     a |     a |     a
## 5  |    5 |     a |     a |     a |     a |     a
## 6  |    6 |     a |     a |     a |     a |     a

Источник:

##    |  uid |   col | value
----------------------------
## 1  |    1 | col_1 |     B
## 2  |    1 | col_2 |     C
## 3  |    4 | col_3 |     D
## 4  |    4 | col_4 |     E
## 5  |    5 | col_3 |     F

Ожидаемый результат:

##    |  uid | col_1 | col_2 | col_3 | col_4 | col_5
----------------------------------------------------
## 1  |    1 |     B |     C |     a |     a |     a
## 2  |    2 |     a |     a |     a |     a |     a
## 3  |    3 |     a |     a |     a |     a |     a
## 4  |    4 |     a |     a |     D |     E |     a
## 5  |    5 |     a |     a |     F |     a |     a
## 6  |    6 |     a |     a |     a |     a |     a

person gastan    schedule 21.08.2020    source источник
comment
Где именно вы хотите поставить CROSS APPLY? Что вы тоже CROSS APPLY делаете, функцию табличного значения? Помогите нам помочь вам. Демонстрационные данные и ожидаемые результаты также помогут в этом.   -  person Larnu    schedule 21.08.2020
comment
Я согласен с @Larnu, нам нужно больше информации, чтобы помочь здесь. В качестве примечания: при использовании оператора MERGE моя целевая таблица указывается просто как таблица, а моя исходная таблица обычно представляет собой запрос. Если это сложный запрос (или вам нужно отфильтровать секционированные/оконные поля), вы можете использовать CTE перед оператором MERGE.   -  person JoeFletch    schedule 21.08.2020
comment
Я добавил образцы данных и ожидаемый результат. У меня нет для этого никакой функции табличного значения. Возможно, я ошибаюсь насчет CROSS APPLY, но я думал, что это функция для решения моей проблемы.   -  person gastan    schedule 24.08.2020


Ответы (1)


Вы можете поместить запрос в круглые скобки, чтобы создать производную таблицу

Пример

MERGE INTO target_table AS t
USING (select * from source_table a cross apply (select top 1 * from other_table b where b.id = a.id order by some_date desc) b2) AS s
ON t.key_column = s.key_column
    AND 'column_1' = s.correction_column
WHEN MATCHED THEN  
UPDATE SET t.column_1 = s.correction_value;
person vvvv4d    schedule 22.08.2020
comment
Какой будет другая_таблица? Думаю, это не решает проблему применения MERGE по всем столбцам target_table. Может быть, моя правка поможет понять проблему. - person gastan; 24.08.2020