Вот один из способов сделать это.
Нам нужна последовательность растущих уникальных чисел без пробелов для таблиц dbo_expedient
и data_db
для сопоставления / сопоставления / объединения их строк.
Мы можем использовать функцию ROW_NUMBER
для генерации такой последовательности.
Сначала рассмотрим простые SELECT
запросы, которые демонстрируют, что происходит.
SELECT
expedient_id
,sheet_number
,data_expedient_entry
,expedient_address
,ROW_NUMBER() OVER (ORDER BY expedient_id) AS rn
FROM dbo_expedient
ORDER BY expedient_id
;
Если expedient_id
в dbo_expedient
гарантированно будет последовательность, начинающаяся с 1 без пробелов, тогда вы можете использовать expedient_id
напрямую, без ROW_NUMBER
.
SELECT
sheet_number
,expedient_entry_data
,name_expedient_owner
,expedient_address
,ROW_NUMBER() OVER (ORDER BY YEAR(expedient_entry_data), sheet_number) AS rn
FROM data_db
ORDER BY YEAR(expedient_entry_data), sheet_number
;
Теперь соедините их вместе в столбце rn
,Наиболее читаемый способ - использовать Common Table Expressions (CTE).
WITH
CTE_Dst
AS
(
SELECT
expedient_id
,sheet_number
,data_expedient_entry
,expedient_address
,ROW_NUMBER() OVER (ORDER BY expedient_id) AS rn
FROM dbo_expedient
)
,CTE_Src
AS
(
SELECT
sheet_number
,expedient_entry_data
,name_expedient_owner
,expedient_address
,ROW_NUMBER() OVER (ORDER BY YEAR(expedient_entry_data), sheet_number) AS rn
FROM data_db
)
SELECT
CTE_Src.sheet_number AS src_sheet_number
,CTE_Src.expedient_entry_data AS src_expedient_entry_data
,CTE_Src.name_expedient_owner AS src_name_expedient_owner
,CTE_Src.expedient_address AS src_expedient_address
,CTE_Dst.expedient_id AS dst_expedient_id
,CTE_Dst.sheet_number AS dst_sheet_number
,CTE_Dst.data_expedient_entry AS dst_data_expedient_entry
,CTE_Dst.expedient_address AS dst_expedient_address
FROM
CTE_Src
INNER JOIN CTE_Dst ON CTE_Dst.rn = CTE_Src.rn
;
После того, как вы проверили результат этого SELECT
и подтвердили, что строки объединены правильно, вы можете UPDATE
значения
WITH
CTE_Dst
AS
(
SELECT
expedient_id
,sheet_number
,data_expedient_entry
,expedient_address
,ROW_NUMBER() OVER (ORDER BY expedient_id) AS rn
FROM dbo_expedient
)
,CTE_Src
AS
(
SELECT
sheet_number
,expedient_entry_data
,name_expedient_owner
,expedient_address
,ROW_NUMBER() OVER (ORDER BY YEAR(expedient_entry_data), sheet_number) AS rn
FROM data_db
)
,CTE_Update
AS
(
SELECT
CTE_Src.sheet_number AS src_sheet_number
,CTE_Src.expedient_entry_data AS src_expedient_entry_data
,CTE_Src.name_expedient_owner AS src_name_expedient_owner
,CTE_Src.expedient_address AS src_expedient_address
,CTE_Dst.expedient_id AS dst_expedient_id
,CTE_Dst.sheet_number AS dst_sheet_number
,CTE_Dst.data_expedient_entry AS dst_data_expedient_entry
,CTE_Dst.expedient_address AS dst_expedient_address
FROM
CTE_Src
INNER JOIN CTE_Dst ON CTE_Dst.rn = CTE_Src.rn
)
UPDATE CTE_Update
SET dst_sheet_number = src_sheet_number
;