多同结构MySQL表按DATETIME关联提取对比数据的SQL语句问询
多表DATETIME匹配下的HIGH/LOW字段对比方案
嘿,这个需求其实很常见,用JOIN就能完美解决!既然所有表的DATETIME值完全一致,我们直接基于这个字段把三张表关联起来,就能把同一时间点的HIGH、LOW数据都放在同一行,方便你直观对比甚至筛选差异。
基础对比查询(查看所有时间点的全部数据)
这个SQL会把三张表同一时间点的HIGH、LOW字段都列出来,每一行对应一个时间点:
SELECT a.DATETIME, a.HIGH AS a_high, a.LOW AS a_low, b.HIGH AS b_high, b.LOW AS b_low, c.HIGH AS c_high, c.LOW AS c_low FROM A a INNER JOIN B b ON a.DATETIME = b.DATETIME INNER JOIN C c ON a.DATETIME = c.DATETIME ORDER BY a.DATETIME;
这里用INNER JOIN是因为你说各表的DATETIME值完全相同,所以不会有遗漏的时间点。如果之后有表可能存在缺失的时间点,可以换成LEFT JOIN来保留所有A表的时间点。
筛选有差异的记录(只看数据不一致的时间点)
如果不需要看全部数据,只想找出HIGH或LOW值存在差异的时间点,可以在查询里加WHERE条件:
SELECT a.DATETIME, a.HIGH AS a_high, b.HIGH AS b_high, c.HIGH AS c_high, a.LOW AS a_low, b.LOW AS b_low, c.LOW AS c_low FROM A a INNER JOIN B b ON a.DATETIME = b.DATETIME INNER JOIN C c ON a.DATETIME = c.DATETIME WHERE -- 筛选HIGH值不一致的情况 a.HIGH != b.HIGH OR a.HIGH != c.HIGH OR b.HIGH != c.HIGH -- 加上LOW值不一致的情况 OR a.LOW != b.LOW OR a.LOW != c.LOW OR b.LOW != c.LOW ORDER BY a.DATETIME;
这样返回的结果里,只有那些至少一个表的HIGH或LOW和其他表不一样的时间点,能帮你快速定位差异数据。
小提醒
- 确保所有表的DATETIME字段精度一致:比如有的表是
DATETIME(不带毫秒),有的是DATETIME(3)(带毫秒),这种细微差异会导致关联失败,需要先统一格式。 - 如果之后新增更多同结构的表,只需要继续添加
INNER JOIN语句,比如INNER JOIN D d ON a.DATETIME = d.DATETIME,然后在SELECT里加上对应的字段即可。
内容的提问来源于stack exchange,提问作者LiveRock




