You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

连接含相同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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:34:35