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

SQL Server中如何关联表并仅获取每个客户的最新记录

获取客户最新手机号与类型的解决方案

问题分析

你遇到重复CustID的核心原因是:CustomerAddress和CustomerType中存在同一AddID/TypeId的多条历史记录,直接关联三张表会产生笛卡尔积,导致同一个客户的信息被多次匹配。要解决这个问题,必须先分别提取每个AddID和TypeId的最新记录,再与Customer表关联。

解决方案SQL

使用窗口函数ROW_NUMBER()筛选每个分组的最新记录,再关联主表:

SELECT c.CustID, t.TypeName, a.Mobile
FROM Customer c
LEFT JOIN (
    -- 获取每个AddID的最新手机号
    SELECT AddID, Mobile
    FROM (
        SELECT 
            AddID, 
            Mobile,
            ROW_NUMBER() OVER (PARTITION BY AddID ORDER BY latestUpdate DESC) AS rn
        FROM CustomerAddress
    ) AS addr
    WHERE rn = 1
) a ON c.AddID = a.AddID
LEFT JOIN (
    -- 获取每个TypeId的最新类型名称
    SELECT TypeId, TypeName
    FROM (
        SELECT 
            TypeId, 
            TypeName,
            ROW_NUMBER() OVER (PARTITION BY TypeId ORDER BY latestUpdate DESC) AS rn
        FROM CustomerType
    ) AS type
    WHERE rn = 1
) t ON c.TypeID = t.TypeId

代码说明

  1. 筛选最新地址记录:对CustomerAddress按AddID分组,用ROW_NUMBER()按latestUpdate降序标记每条记录的序号,取序号为1的记录(即该地址对应的最新手机号)。
  2. 筛选最新类型记录:对CustomerType按TypeId分组,同样用ROW_NUMBER()筛选出该类型对应的最新名称。
  3. 关联主表:用LEFT JOIN将Customer表与上述两个筛选结果关联,确保所有客户都被保留(即使部分客户无对应最新地址/类型,对应字段会显示NULL)。

执行结果

基于你提供的测试数据,执行后会得到以下结果:

CustIDTypeNameMobile
1Second55555
2NULL99999
3Third11111
4FourthNULL
5FifthNULL

(注:CustID2的TypeId2在CustomerType中无匹配记录,CustID4/5的AddID4/5在CustomerAddress中无匹配记录,因此对应字段显示NULL)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:01:25