连接含相同ID的表出现重复数据的解决方案咨询
解决多表连接丢失key1不匹配数据的问题
我明白你的问题了——当你用key1=key1做等值连接时,那些key1值不匹配的行直接丢失了,尤其是部分表只有单行且key1和其他表都不一致的情况,确实很棘手。下面给你两种针对性的解决方案,根据你的实际需求选择:
方案1:用FULL OUTER JOIN保留所有行(横向连接)
如果需要把多个表的字段横向拼接,同时保留所有表的所有行(不管key1是否匹配),FULL OUTER JOIN是最佳选择。它会保留左右两个表中所有不匹配的行,不匹配的字段会填充为NULL。配合COALESCE函数可以统一展示关联的主键(比如empl或key1),让结果更清晰。
示例代码(两个表的情况)
首先创建第二个测试表:
CREATE TABLE ##ZZSP01( empl BIGINT, key1 INT, sal decimal ) INSERT INTO ##ZZSP01 ( empl, key1 ,sal ) VALUES ( 1, 4, 20 )
然后执行全外连接:
SELECT COALESCE(t1.empl, t2.empl) AS empl, -- 统一展示员工ID,哪个表有值就取哪个 COALESCE(t1.key1, t2.key1) AS key1, -- 统一展示key1值 t1.sal AS sal_zzsp00, -- 明确标注来自第一个表的薪资 t2.sal AS sal_zzsp01 -- 明确标注来自第二个表的薪资 FROM ##ZZSP00 t1 FULL OUTER JOIN ##ZZSP01 t2 ON t1.empl = t2.empl AND t1.key1 = t2.key1 -- 建议同时用empl+key1连接,避免跨员工匹配
多表扩展(三个及以上表)
如果有更多表,只需要逐层叠加FULL OUTER JOIN,并且用COALESCE把前面所有表的key1/empl作为连接条件:
SELECT COALESCE(t1.empl, t2.empl, t3.empl) AS empl, COALESCE(t1.key1, t2.key1, t3.key1) AS key1, t1.sal AS sal_zzsp00, t2.sal AS sal_zzsp01, t3.sal AS sal_zzsp02 FROM ##ZZSP00 t1 FULL OUTER JOIN ##ZZSP01 t2 ON t1.empl = t2.empl AND t1.key1 = t2.key1 FULL OUTER JOIN ##ZZSP02 t3 ON COALESCE(t1.empl, t2.empl) = t3.empl AND COALESCE(t1.key1, t2.key1) = t3.key1
方案2:用UNION ALL纵向合并所有数据
如果你的需求不是横向拼接字段,而是把所有表的行合并到一起查看,那用UNION ALL更合适。它会保留所有行,不会做任何匹配过滤,还可以添加字段标注数据来源。
示例代码
SELECT empl, key1, sal, 'ZZSP00' AS table_source FROM ##ZZSP00 UNION ALL SELECT empl, key1, sal, 'ZZSP01' AS table_source FROM ##ZZSP01 UNION ALL SELECT empl, key1, sal, 'ZZSP02' AS table_source FROM ##ZZSP02
这个方案的好处是简单直接,所有数据都会保留,适合需要汇总所有表记录的场景。
关键提醒
- 不要用
INNER JOIN:它只保留key1完全匹配的行,这就是你丢失数据的根本原因。 - 连接条件尽量精准:如果empl是员工唯一标识,一定要把
empl也加入连接条件,避免不同员工的key1值巧合匹配导致错误结果。
内容的提问来源于stack exchange,提问作者raj
相关产品推荐
相关产品推荐

