Что у меня есть:
Две таблицы A и B.
A: Col1 Col2 Col3 Col1_Transformed Col2_Transformed
B: Col1 Col2 Col3
У них точно такие же столбцы, за исключением некоторых измененных данных, ни у одного из них нет первичного ключа, уникального поля или чего-то еще (это крайний случай, который мне нужно обработать).
Таблица A содержит только часть данных из таблицы B. Допустим, я читаю таблицу B партиями по 10000 строк, затем изменяю данные и записываю их в таблицу A (столбцы * _Transform).
Что мне нужно:
Мне нужно обновить таблицу B, используя данные из таблицы A. Будет легко иметь первичный ключ или какой-либо столбец идентификаторов:
UPDATE target
SET target.Col1 = source.__Col1
FROM B target
join A as source
ON target.Id = source.Id
Но у меня их нет.
Следующее естественное предположение - использовать естественный ключ, сформированный из Col1 Col2 Col3.
UPDATE target
SET target.Col1 = source.__Col1
FROM B target
join A as source
ON target.Col1 = source.Col1 AND
target.Col2 = source.Col2 AND
target.Col3 = source.Col3
Это не сработает, причина в возможном сравнении значения NULL. Если target.Col1 или source.Col1 имеет значение NULL, то вся запись исключается из обновления.
Предположение № 3 (используя номер строки):
Я хочу добавить row_number в таблицу A, это будет мой ключ.
A: row_numb Col1 Col2 Col3 Col1_Transformed Col2_Transformed
И чем просто присоединиться к таблице B:
UPDATE target
SET target.Col1 = source.__Col1
FROM B target
join A as source
ON ROW_NUMBER() OVER(ORDER BY target.Col1,target.Col2,target.Col3) = source.ROW_NUMB
Bur row_nubmer нельзя использовать в предложении соединения.
Есть идеи, как это сделать?