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
代码说明
- 筛选最新地址记录:对
CustomerAddress按AddID分组,用ROW_NUMBER()按latestUpdate降序标记每条记录的序号,取序号为1的记录(即该地址对应的最新手机号)。 - 筛选最新类型记录:对
CustomerType按TypeId分组,同样用ROW_NUMBER()筛选出该类型对应的最新名称。 - 关联主表:用
LEFT JOIN将Customer表与上述两个筛选结果关联,确保所有客户都被保留(即使部分客户无对应最新地址/类型,对应字段会显示NULL)。
执行结果
基于你提供的测试数据,执行后会得到以下结果:
| CustID | TypeName | Mobile |
|---|---|---|
| 1 | Second | 55555 |
| 2 | NULL | 99999 |
| 3 | Third | 11111 |
| 4 | Fourth | NULL |
| 5 | Fifth | NULL |
(注:CustID2的TypeId2在CustomerType中无匹配记录,CustID4/5的AddID4/5在CustomerAddress中无匹配记录,因此对应字段显示NULL)
内容的提问来源于stack exchange,提问作者R A
相关产品推荐
相关产品推荐

