Обновите несколько столбцов на основе значений из другой таблицы в SQL Server - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно обновить несколько столбцов в «основной» таблице на основе значений в «справочной» таблице. Например, в приведенных примерах данных @MAIN_TABLE должен быть обновлен как ABC_VAL = 11111, KLM_VAL = 33333, XYZ_VAL = 22222 для первой записи (ID_1 = 10, ID_2 = 100) на основе условий соединения (main.ID_1 = ref .ID_1 и main.ID_2 = ref.ID_2), а также значение поля ref.FLD_NAME. то есть, если ref.FLD_NAME = 'ABC', main.ABC_VAL должен быть обновлен соответствующим ref.FLD_VAL.

DECLARE @MAIN_TABLE TABLE ([ID_1] INT, [ID_2] INT, [ABC_VAL] INT, [KLM_VAL] INT, [XYZ_VAL] INT) 
insert @MAIN_TABLE values
(10,100,NULL,NULL,NULL),
(10,200,NULL,NULL,NULL),
(30,300,NULL,NULL,NULL)


DECLARE @REF_TABLE TABLE ([ID_1] INT, [ID_2] INT, [FLD_NAME] varchar(3),[FLD_VAL] INT) 
insert @REF_TABLE values
(10,100,'ABC',11111),
(10,100,'XYZ',22222),
(10,100,'KLM',33333),
(20,200,'ABC',88888),
(30,300,'KLM',55555)

Ответы [ 3 ]

0 голосов
/ 29 апреля 2019

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

DECLARE @MAIN_TABLE TABLE ([ID_1] INT, [ID_2] INT, [ABC_VAL] INT, [KLM_VAL] INT, [XYZ_VAL] INT) 
insert @MAIN_TABLE values
(10,100,NULL,NULL,NULL),
(10,200,NULL,NULL,NULL),
(30,300,NULL,NULL,NULL)


DECLARE @REF_TABLE TABLE ([ID_1] INT, [ID_2] INT, [FLD_NAME] varchar(3),[FLD_VAL] INT) 
insert @REF_TABLE values
(10,100,'ABC',11111),
(10,100,'XYZ',22222),
(10,100,'KLM',33333),
(20,200,'ABC',88888),
(30,300,'KLM',55555)

SELECT * FROM @MAIN_TABLE
SELECT * FROM @REF_TABLE

UPDATE MT
SET MT.ABC_VAL = B.ABC_VAL,
MT.XYZ_VAL = B.XYZ_VAL,
MT.KLM_VAL = B.KLM_VAL
FROM @MAIN_TABLE MT
INNER JOIN (
    SELECT A.ID_1,A.ID_2,
    SUM(A.ABC_FLD_VAL) AS [ABC_VAL],
    SUM(A.XYZ_FLD_VAL) AS [XYZ_VAL],
    SUM(A.KLM_FLD_VAL) AS [KLM_VAL]
    FROM (
        SELECT DISTINCT MT.ID_1,MT.ID_2,
        CASE WHEN rt.FLD_NAME = 'ABC' THEN FLD_VAL  ELSE NULL END 'ABC_FLD_VAL',
        CASE WHEN rt.FLD_NAME = 'XYZ' THEN FLD_VAL ELSE NULL END 'XYZ_FLD_VAL',
        CASE WHEN rt.FLD_NAME = 'KLM' THEN FLD_VAL ELSE NULL END 'KLM_FLD_VAL'

        FROM @MAIN_TABLE MT
        INNER JOIN @REF_TABLE RT ON RT.ID_1 = MT.ID_1 AND RT.ID_2 = MT.ID_2
    ) A
    GROUP BY  A.ID_1,A.ID_2
) B
ON MT.ID_1 = B.ID_1
AND MT.ID_2 = B.ID_2

SELECT * FROM @MAIN_TABLE
0 голосов
/ 29 апреля 2019

Вы можете справиться с этим, используя PIVOT таблицу.

UPDATE MN
SET MN.[ABC_VAL] = REF.ABC,
    MN.[KLM_VAL] = REF.KLM,
    MN.[XYZ_VAL] = REF.XYZ
FROM @MAIN_TABLE MN 
INNER JOIN 
(
SELECT * 
FROM @REF_TABLE
PIVOT 
(MIN([FLD_VAL])  FOR [FLD_NAME] IN ([ABC],[XYZ],[KLM])
)AS PIVOTTABLE)REF ON MN.[ID_1] = REF.[ID_1] AND MN.[ID_2] = REF.[ID_2]

select * from @MAIN_TABLE
0 голосов
/ 29 апреля 2019

вы можете использовать update join используя case when expression

update m set ABC_VAL = abc, XYZ_VAL = xyz, KLM_VAL = klm
from @MAIN_TABLE m
join
(
  select id_1, id_2, min(case when fld_name = 'ABC' then fld_val end) as abc,
    min(case when fld_name = 'XYZ' then fld_val end) as xyz,
    min(case when fld_name = 'KLM' then fld_val end) as klm,
  from @REF_TABLE
  group by id_1, id_2, fld_name
) A on m.id_1 = a.id_1 and m.id_2 = a.id_2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...