sql - 根据 SQL Server 中其他表的值更新多个列
问题描述
我需要根据“参考”表中的值更新“主”表中的多个列。例如,在给出的示例数据中,@MAIN_TABLE 应根据连接条件 (main.ID_1=ref) 更新为第一条记录 (ID_1=10, ID_2=100) 的 ABC_VAL=11111, KLM_VAL=33333, XYZ_VAL=22222 .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)
解决方案
您可以使用以下脚本使用所需的结果更新列 -
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
推荐阅读
- google-cloud-platform - 有时在 Google Cloud Run 上出现 404 错误
- python-behave - 如何在 Behave 的特征场景中保持常量
- java - 如何使用 SASL_SSL 连接 Apache Kafka 设置 Spring Cloud Kafka 项目?
- python - Creating new columns from the values of another column
- javascript - 如何以角度突出显示文本输入占位符中的文本?
- angular - 从角度的发布请求中获取数据
- react-native - 反应原生 | 'TouchableOpacity' 的最佳替代品是什么?
- r - r 计算数据框中多个变量的综合得分和 cronbach 的 alpha 并将它们添加为列
- java - How to Split a logical expression on operators as delimiters, while keeping them in the result?
- jquery - Jquery Validation Plugin 在 Chrome 中工作,但在 Mozilla 中不工作