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

SQL多表关联按ID取最大日期数据的Code过滤查询实现

原SQL错误定位
  • 字段归属完全错配:Table2(别名b)仅存储ID、Code、Name字段,不存在Date、Address属性;原SQL在关联子查询时引用b.Date、关联Table3时匹配b.Address、筛选条件写a.Code(Table1无Code字段),都是关联逻辑的根本错误
  • 子查询语法错误:计算最大日期的子查询中,Address与聚合函数max()之间缺失逗号,且select列表包含未聚合的Address字段,但group by仅按ID分组,不符合SQL执行规范
  • 关联偏差:筛选同ID下最大日期行的判断逻辑,应该作用在Table1的日期字段上,而非不存在的Table2日期字段
可行实现方案

方案1:窗口函数实现(推荐)

性能更优,仅需一次扫描Table1,适合SQL Server 2012及以上版本:

SELECT 
    b.Name,
    a.Price,
    c.AddName,
    a.Date
FROM (
    -- 按ID分组,按日期倒序排序,取每组排名第一的行
    SELECT 
        ID, Price, Date, Address,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CONVERT(datetime, Date, 103) DESC) AS row_rank
    FROM [Table 1]
) a
INNER JOIN [Table 2] b 
    ON a.ID = b.ID
INNER JOIN [Table 3] c 
    ON a.Address = c.Address
WHERE 
    a.row_rank = 1 -- 仅保留每组最大日期的记录
    AND b.Code = @input_code -- 动态传入的Code过滤参数
ORDER BY CONVERT(datetime, a.Date, 103) DESC
  • 若业务要求同ID下相同最大日期的所有记录都保留,可将ROW_NUMBER()替换为RANK()

方案2:最大日期关联实现(兼容低版本SQL Server)

通过先聚合算出每个ID的最大日期,再回连原表取对应记录:

SELECT 
    b.Name,
    a.Price,
    c.AddName,
    a.Date
FROM [Table 1] a
INNER JOIN (
    -- 计算每个ID对应的最大日期
    SELECT ID, MAX(CONVERT(datetime, Date, 103)) AS max_date
    FROM [Table 1]
    GROUP BY ID
) max_t 
    ON a.ID = max_t.ID 
    AND CONVERT(datetime, a.Date, 103) = max_t.max_date
INNER JOIN [Table 2] b 
    ON a.ID = b.ID
INNER JOIN [Table 3] c 
    ON a.Address = c.Address
WHERE 
    b.Code = @input_code -- 动态传入的Code过滤参数
ORDER BY max_t.max_date DESC
落地注意事项
  • 日期格式适配:测试数据中Date为dd.mm.yyyy格式,使用CONVERT(datetime, Date, 103)转换是符合SQL Server格式规范的
  • 地址匹配问题:测试数据中Address存在大小写不统一的情况(如str. Abc与str. abc),若数据库排序规则对大小写敏感,需提前做地址标准化处理后再关联Table3
  • 排序规则补充:若同ID下存在多条日期相同的记录,可在窗口函数的ORDER BY中增加次级排序字段(如Price、ID),保证结果稳定性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 08:57:03