SQL跨表查询:根据table1最大时间戳sn取table2对应code值
报错原因
你写的SQL执行失败的核心问题是:= 操作符要求匹配的右侧子查询只能返回单个单列结果,但你写的子查询select sn, max(timestamp) from table1 GROUP BY sn会同时返回两列数据,且按sn分组后会输出多行结果,完全不符合单值匹配的语法要求,必然报错。
另外你原来子查询的逻辑也不对:按sn分组取max(timestamp)会返回每个sn各自的最大时间戳,根本不是你要的「table1全局最大epoch时间戳对应的sn」。
实现方案
这个需求不强制要求使用JOIN,两种写法都能满足要求,你可以根据场景选:
方案1:嵌套子查询(无JOIN,贴合你原写法的逻辑)
完全按照你描述的两步逻辑实现,不需要关联表,写法最直接:
SELECT code FROM table2 WHERE sn = ( -- 先查table1中全局最大时间戳对应的sn SELECT sn FROM table1 ORDER BY timestamp DESC LIMIT 1 ) -- 再取该sn下最大时间戳对应的code ORDER BY timestamp DESC LIMIT 1;
如果存在多个sn同时命中table1全局最大时间戳的边界场景,把=换成IN即可兼容。
方案2:JOIN写法
如果习惯用关联查询的写法也可以,在sn、timestamp字段建了索引的前提下,执行效率和子查询写法没有明显差异:
SELECT t2.code FROM table2 t2 INNER JOIN ( SELECT sn FROM table1 ORDER BY timestamp DESC LIMIT 1 ) t1_latest ON t2.sn = t1_latest.sn ORDER BY t2.timestamp DESC LIMIT 1;
注意点
不要在取最大时间戳对应记录的时候乱用GROUP BY的写法,这种写法只能拿到每个分组内的聚合值,拿不到全局排序后第一条的目标记录,和需求逻辑不匹配。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

