基于最大日期去重关联Test1与Test2表的SQL查询问题
问题分析
你的脚本返回空结果的核心原因是子查询取的是全局最大日期,而非每个Cat对应的最大日期,同时select语句中列名之间缺少逗号(语法错误)。
以你的测试数据为例:
- Test1中
Cat=123412的最大日期是2023-01-01 13:02:01 - Test2中
Cat=123412的最大日期是2023-01-01 15:02:01
原脚本的where test1.date = (select max(test1.date) from Test1)能正确筛选出Test1中该Cat的最大日期记录,但左连接条件test2.date = (select max(test2.date) from Test2)是取Test2全局最大日期,若存在语法错误或逻辑匹配偏差,就会返回空结果。
解决方案
以下两种方法均可实现“每个Cat对应最大日期的无重复记录”需求:
方法一:子查询筛选单表最大日期记录后关联
先分别筛选出两张表中每个Cat的最大日期记录,再进行关联:
select test1.cat, test2.cat from -- 筛选Test1中每个Cat的最大日期记录 (select cat, dog, date from Test1 t1 where date = (select max(date) from Test1 where cat = t1.cat)) test1 left join -- 筛选Test2中每个Cat的最大日期记录 (select cat, parrot, date from Test2 t2 where date = (select max(date) from Test2 where cat = t2.cat)) test2 on test2.cat = test1.cat
方法二:先分组获取最大日期,再关联原表
先通过分组得到每个Cat的最大日期,再关联原表获取完整记录:
select t1.cat, t2.cat from -- 获取Test1每个Cat的最大日期 (select cat, max(date) as max_date from Test1 group by cat) t1_max -- 关联Test1得到对应最大日期的完整记录 join Test1 t1 on t1.cat = t1_max.cat and t1.date = t1_max.max_date left join -- 获取Test2每个Cat的最大日期 (select cat, max(date) as max_date from Test2 group by cat) t2_max on t2_max.cat = t1.cat -- 关联Test2得到对应最大日期的完整记录 left join Test2 t2 on t2.cat = t2_max.cat and t2.date = t2_max.max_date
关键说明
- 两种方法都确保了按Cat分组取最大日期,而非全局最大,能正确匹配每个Cat对应的最新记录
- 保留左连接逻辑,确保即使Test2中没有对应Cat的记录,也能显示Test1的结果
- 修复了select语句中列名之间缺少逗号的语法错误
内容的提问来源于stack exchange,提问作者Noname
相关产品推荐
相关产品推荐

