Таблица обновления SQL Server, но пропускает некоторые строки с определенным условием - PullRequest
0 голосов
/ 11 июня 2018

У меня есть таблица с именем body_scan, которая выглядит следующим образом:

body_no  tag
--------------------
1        noscan
2        noscan
3        missing
4        noscan
5        missing

У меня также есть список, который я могу загрузить во временную таблицу следующим образом:

tag_no
------
aaa
bbb
ccc

ЧтоМне нужно уметь обновлять таблицу body_scan номерами тегов во временной таблице.

Вы заметите, что в таблице temp только 3 тега, а в таблице body_scan - 5.Мне нужно обновить значение тега «noscan» значениями из временной таблицы и оставить пропущенные без изменений.

Порядок тегов во временной таблице совпадает с порядком body_noиз таблицы body_scan.

Так что да, я рассмотрел функцию row_number().Но я просто не уверен на 100%, как правильно определить соединение ..

Как мне этого добиться, пожалуйста?

Желаемый результат:

body_no  tag
-------------------
1        aaa
2        bbb
3        missing
4        ccc
5        missing

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Я не могу понять ваше объяснение и командную дискуссию.Я тренируюсь (в SQL 2012) для достижения вашей таблицы OUTPUT.Как,

update a
set a.tag = t.tag
from (
 select m.*, ROW_NUMBER() over(partition by m.tag order by m.rn)trn from(
  select *, row_number() over(partition by (select null) order by (select null)) rn from body_scan --set order what the order of actual table's order
 ) m --set row number for noscan rows
) a
join(
 select *, ROW_NUMBER() over(order by (select null)) rn from #temp --set order what the order of actual table order
) t
on a.trn = t.rn and a.tag <> 'missing' -- join to noscan rows using row numbers

ВЫХОД:

body_no   tag
--------------
   1      aaa
   2      bbb
   3      missing
   4      ccc
   5      missing
0 голосов
/ 11 июня 2018

Во-первых, вам нужно сохранить порядок данных для входного файла, добавив поле 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;

(Есть полдюжины способов написать это последнее утверждение, но я предпочитаютаким образом, как вы можете видеть набор данных, из которого вы обновляете в под-выбор)

...