SQL Server带公式的UPDATE子查询问题:更新笛卡尔积表求和列
解决table2的sum列更新问题
我来帮你搞定这个更新table2的需求!咱们的目标是把table1里对应Name1和Name2的频率相加,更新到table2的sum列对吧?下面给你两种靠谱的实现方式,顺便说说可能踩的坑。
方法一:用UPDATE JOIN(推荐,效率更高)
这种方式通过两次关联table1来获取两个姓名的频率,直接计算赋值,逻辑清晰且性能更好:
UPDATE table2 JOIN table1 t1 ON table2.Name1 = t1.Name JOIN table1 t2 ON table2.Name2 = t2.Name SET table2.sum = t1.Frequency + t2.Frequency;
这里给table1起了两个别名t1和t2,分别对应table2里的Name1和Name2,关联后直接把两个频率相加赋值给sum列。
方法二:带公式的关联子查询
如果一定要用子查询的方式,你可以用标量子查询(确保每个子查询只返回单个值),写法如下:
UPDATE table2 SET sum = ( SELECT Frequency FROM table1 WHERE Name = table2.Name1 ) + ( SELECT Frequency FROM table1 WHERE Name = table2.Name2 );
每个括号里的子查询都会根据当前table2行的Name1/Name2去table1里找对应的频率,然后相加赋值。
注意事项:处理不存在的姓名
如果table2里的Name1或Name2在table1中没有对应的记录,上面的写法会得到NULL(因为子查询找不到数据返回NULL,NULL加任何值都是NULL)。这时候可以用COALESCE函数把NULL替换成0:
UPDATE table2 SET sum = COALESCE( (SELECT Frequency FROM table1 WHERE Name = table2.Name1), 0 ) + COALESCE( (SELECT Frequency FROM table1 WHERE Name = table2.Name2), 0 );
可能的错误原因
你之前的实现出问题,大概率是这几种情况:
- 子查询没有和table2做关联,导致返回了多行数据或者固定值,不是对应行的频率
- 关联条件写错了,比如把
Name1和Name2搞混了 - 没有处理NULL的情况,导致sum列出现意外的NULL值
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

