SQL中源表无匹配数据时更新目标表的正确语句求助
SQL中源表无匹配数据时更新目标表的正确语句求助
我完全懂你的需求啦——你想要把目标表tableA中那些EmpId+CourseId组合在源表tableB里找不到匹配的记录,把它们的isthere字段更新为"no",但之前尝试的左连接写法没达到预期效果,对吧?我来帮你梳理几个靠谱的解决方案~
先说说你之前写法的问题
你第一次尝试的左连接更新语句,会把所有在tableB中没有匹配的tableA记录都更新(包括EmpId完全不在tableB里的情况);而第二次加了tableA.EmpId = tableB.EmpId的条件,因为左连接不匹配时tableB.EmpId是NULL,这个条件永远不成立,所以根本不会更新任何记录。
方案1:用NOT EXISTS的UPDATE语句(推荐)
这种写法逻辑直观,能精准定位到tableA中在tableB里没有对应EmpId+CourseId的记录:
UPDATE tableA SET isthere = 'no' WHERE NOT EXISTS ( SELECT 1 FROM tableB WHERE tableB.EmpId = tableA.EmpId AND tableB.CourseId = tableA.CourseId )
如果只需要针对特定EmpId(比如你例子里的EmpId=1)更新,只需在WHERE里追加条件:
UPDATE tableA SET isthere = 'no' WHERE EmpId = 1 AND NOT EXISTS ( SELECT 1 FROM tableB WHERE tableB.EmpId = tableA.EmpId AND tableB.CourseId = tableA.CourseId )
方案2:用MERGE语句(适合复杂同步场景)
如果之后还需要同时处理插入/更新其他字段的场景,MERGE会更灵活,针对你的需求写法如下:
MERGE INTO tableA AS target USING tableB AS source ON target.EmpId = source.EmpId AND target.CourseId = source.CourseId WHEN NOT MATCHED BY SOURCE THEN UPDATE SET isthere = 'no';
这个语句会匹配target(tableA)和source(tableB)的EmpId+CourseId组合,当source里没有对应匹配时,就更新target的isthere为"no"。
备注:内容来源于stack exchange,提问作者Garapati Gokul Sairam
相关产品推荐
相关产品推荐

