如何基于两个表的Id字段更新行并获取合并结果的SELECT语句
实现方案
你要的基于Id匹配、优先取Table2数据的SELECT查询可以通过以下两种方式实现:
方案1:FULL OUTER JOIN 实现(逻辑直观)
通过全外连接关联两个表,用COALESCE函数优先取Table2的字段值,匹配时自动覆盖Table1的旧数据:
SELECT COALESCE(t2.Id, t1.Id) AS Id, COALESCE(t2.name, t1.name) AS name, COALESCE(t2.number, t1.number) AS number, COALESCE(t2.value, t1.value) AS value FROM Table1 t1 FULL OUTER JOIN Table2 t2 ON t1.Id = t2.Id ORDER BY Id ASC;
方案2:UNION ALL 实现(兼容性好、执行效率高)
先筛选出Table1中Id不在Table2里的保留行,再合并全部Table2的数据,也可以得到完全一致的结果:
-- 取Table1中没有被Table2覆盖的旧数据 SELECT Id, name, number, value FROM Table1 WHERE Id NOT IN (SELECT Id FROM Table2) UNION ALL -- 取Table2的全部数据(包含更新行和新增行) SELECT Id, name, number, value FROM Table2 ORDER BY Id ASC;
补充:如果你的Id字段可能存在NULL值,方案2的
NOT IN可以替换为NOT EXISTS写法避免逻辑错误:SELECT Id, name, number, value FROM Table1 t1 WHERE NOT EXISTS ( SELECT 1 FROM Table2 t2 WHERE t2.Id = t1.Id )
两种写法运行后都可以得到你给出的预期输出结果。
内容的提问来源于stack exchange,提问作者Py1996
相关产品推荐
相关产品推荐

