Во-первых, вам нужно сохранить порядок данных для входного файла, добавив поле identity
к temp_table
(обратите внимание, что некоторые инструменты ETL вставляют данные параллельно и что все портит, так что выможет даже понадобиться добавить этот столбец в файл)
Как только вы это сделаете, вам нужно сгенерировать ключ в body_scan, к которому вы можете присоединиться.Это просто ROW_NUMBER()
над существующей таблицей, исключая пропущенные строки
Возвращает строку и то, чему она должна соответствовать в temp_table
SELECT
body_no,
ROW_NUMBER() OVER (ORDER BY body_no) RN
FROM body_scan
WHERE tag<> 'missing';
Это присоединяется во временномtable (предполагается, что ваш порядковый столбец называется RowID)
SELECT T1.body_no, T1.tag, T1.RN, T2.tag_no
FROM
(
SELECT
body_no,tag,
ROW_NUMBER() OVER (ORDER BY body_no) RN
FROM body_scan
WHERE tag<> 'missing'
) T1
INNER JOIN
temp_table T2
ON T1.RN=T2.RowID;
Это обновляет его обратно в таблицу:
UPDATE TGT
SET tag=SRC.tag_no
FROM body_scan TGT
INNER JOIN
(
SELECT T1.body_no, T2.tag_no
FROM
(
SELECT
body_no,tag,
ROW_NUMBER() OVER (ORDER BY body_no) RN
FROM body_scan
WHERE tag<> 'missing'
) T1
INNER JOIN
temp_table T2
ON T1.RN=T2.RowID
) SRC
ON SRC.body_no=TGT.body_no;
(Есть полдюжины способов написать это последнее утверждение, но я предпочитаютаким образом, как вы можете видеть набор данных, из которого вы обновляете в под-выбор)