[英]SQL Query to update a column based on the values of other columns in the same table
[英]Update multiple columns based on values from other table in SQL Server
我需要根據“參考”表中的值更新“主”表中的多列。 例如,在給定的示例數據中,@MAIN_TABLE 應根據連接條件 (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)
您可以使用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
您可以使用以下腳本使用所需的結果更新列 -
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
您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.