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

SQL Server数据关联疑问:LEFT JOIN后ID=4出现4条重复记录

嘿,我来帮你拆解下这个问题哈~

为什么左连接后ID=4会出现4条记录?

这其实是左外连接的正常行为哦!当你用p.ID = c.ID作为关联条件时,SQL Server会把Position表中ID=4的那条记录,和Contract表中所有ID=4的记录做一一匹配。如果Contract表里恰好有4条ID=4的记录,那自然就会返回4条关联后的结果啦。

怎么调整到你想要的整合效果?

具体怎么处理要看你最终想要的表结构是什么样的,给你几个常见的解决方案:

  • 如果想给每个Position只关联最新的一条Contract记录,可以用窗口函数ROW_NUMBER()来筛选:
    WITH RankedContracts AS (
        SELECT *,
               -- 按Contract的创建时间倒序排序,取每个ID下的第一条
               ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CreateDate DESC) AS rn
        FROM dbo.Contract
    )
    SELECT p.*, c.*
    FROM dbo.Position p
    LEFT JOIN RankedContracts c ON p.ID = c.ID AND c.rn = 1;
    
    记得把CreateDate换成你实际用来判断“最新”的字段(比如更新时间、生效时间)。
  • 如果想把同一Position对应的多条Contract详情合并成一个字段(比如用逗号分隔),可以用STRING_AGG()(SQL Server 2017及以上版本支持):
    SELECT p.*,
           -- 把Contract的详情字段合并成字符串,这里替换成你实际的详情字段名
           STRING_AGG(c.ContractDetail, ', ') AS ContractDetails
    FROM dbo.Position p
    LEFT JOIN dbo.Contract c ON p.ID = c.ID
    GROUP BY p.ID, p.PositionName, p.其他所有字段; -- 要把Position表的所有字段都列在GROUP BY里
    
  • 最后别忘了检查关联条件:你是不是用错了关联字段?比如Contract表里的外键会不会不是ID,而是PositionID这类专门关联Position表的字段?如果关联条件不对,也会导致匹配到多余的记录。
快速排查小技巧

要是你想先确认Contract表中ID=4的记录数,直接跑这条语句就能一目了然:

SELECT * FROM dbo.Contract WHERE ID = 4;

内容的提问来源于stack exchange,提问作者Macin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:16:35