如何通过邮箱关联更新Table A的Points列:空值取B值,非空求和
解决方案:关联两张表更新Points列
问题背景
已知:
- Table B的所有行均存在于Table A中;
- Table A的行数多于Table B。
需要通过邮箱地址关联两张表,更新Table A的Points列:
- 若A.Points为空值,用B.Points的值替换;
- 若A.Points已有值,将A.Points与B.Points求和后作为新值。
原语句的问题
- 使用
sum()函数报错:sum()是聚合函数,用于对多行数据分组求和,不能直接用于单行的两个列值相加,单行求和应使用加号+。 - 用加号后修改行数过多:原语句用
LEFT JOIN会包含Table A的所有行,对于Table A中不存在于Table B的行,tableB.points会是NULL,此时tableA.points + NULL结果为NULL,导致这些原本不需要更新的行也被修改,所以受影响行数远超预期。
正确的更新语句
方法1:使用COALESCE函数
COALESCE会返回参数列表中第一个非NULL的值,用它处理tableA.points为NULL的情况,同时用INNER JOIN仅匹配两张表共有的行(避免修改A中额外的行):
UPDATE tableA INNER JOIN tableB ON tableA.email = tableB.email SET tableA.points = COALESCE(tableA.points, 0) + tableB.points;
当tableA.points为NULL时,COALESCE(tableA.points, 0)返回0,加上tableB.points就等价于直接用B的值替换;当A的Points有值时,正常求和。
方法2:使用IF函数
逻辑更直观,直接判断tableA.points是否为NULL:
UPDATE tableA INNER JOIN tableB ON tableA.email = tableB.email SET tableA.points = IF(tableA.points IS NULL, tableB.points, tableA.points + tableB.points);
验证建议
执行更新前,可以先运行查询语句确认匹配的行和计算结果是否正确:
SELECT tableA.email, tableA.points AS original_points, tableB.points AS b_points, COALESCE(tableA.points, 0) + tableB.points AS new_points FROM tableA INNER JOIN tableB ON tableA.email = tableB.email;
内容的提问来源于stack exchange,提问作者linstar
相关产品推荐
相关产品推荐

