如何依据A、B表条件更新C表inAorB列的所有行
解决方案
表结构说明
- 表A:
aId aCode 1 ABC 2 DEF 3 GHI
- 表B:
bId bCode 1 JKL 2 MNO 3 PQR
- 表C(初始状态):
cId cCode inAorB 1 ABC NULL 2 GHI NULL 3 PQR NULL
更新SQL语句
可以通过两种方式实现需求:
方式1:使用CASE+EXISTS判断
逻辑直观,逐行检查cCode是否存在于A或B表:
UPDATE C SET inAorB = CASE -- 优先匹配表A的情况 WHEN EXISTS (SELECT 1 FROM A WHERE A.aCode = C.cCode) THEN 'A' -- 匹配表B的情况 WHEN EXISTS (SELECT 1 FROM B WHERE B.bCode = C.cCode) THEN 'B' -- 可选:若存在既不在A也不在B的行,可设置默认值,比如ELSE NULL END -- 仅更新存在于A或B的行(如需更新所有行,可去掉WHERE条件) WHERE EXISTS (SELECT 1 FROM A WHERE A.aCode = C.cCode) OR EXISTS (SELECT 1 FROM B WHERE B.bCode = C.cCode);
方式2:使用LEFT JOIN关联表
适合批量处理,通过左连接判断cCode的归属:
UPDATE C LEFT JOIN A ON C.cCode = A.aCode LEFT JOIN B ON C.cCode = B.bCode SET inAorB = CASE WHEN A.aCode IS NOT NULL THEN 'A' WHEN B.bCode IS NOT NULL THEN 'B' END WHERE A.aCode IS NOT NULL OR B.bCode IS NOT NULL;
说明
- 若
cCode同时出现在表A和表B,两种写法都会优先将inAorB设为'A',符合需求规则。 - 若要更新表C所有行(包括不在A/B中的行),去掉
WHERE条件即可,此时不在A/B中的行inAorB会保持NULL(或按ELSE设置的值)。
内容的提问来源于stack exchange,提问作者Hrvoje T
相关产品推荐
相关产品推荐

