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

如何从两张MySQL表按日期获取差异数据?SQL语句异常排查

你的SQL语句主要有两个问题,咱们一个个拆解说明:

1. LEFT JOIN 被 WHERE 条件“降级”成了 INNER JOIN

你用LEFT JOIN的初衷应该是想保留table1的所有记录,不管table2有没有匹配的对应条目。但你的WHERE a.updated > b.updated条件会直接过滤掉那些table2中没有匹配的记录——因为此时b.updated是NULL,而任何和NULL的比较结果都是UNKNOWN,无法满足WHERE条件。这就导致你的LEFT JOIN实际上和INNER JOIN效果一样,只保留了两边都有匹配的记录。

2. SELECT 子句包含了不存在的字段

你写了a.created,但从你提供的表结构来看,table1里并没有created这个字段,这会直接导致SQL执行报错,应该是个笔误,记得改成表中实际存在的字段(比如直接去掉这个字段)。


正确的SQL写法(分两种场景)

场景1:只找table1中在table2有对应记录,且更新的条目

这种情况用INNER JOIN更直观,因为我们只需要两边都匹配的记录:

SELECT a.`id`, a.`name`, a.`namespace`, a.`updated` 
FROM table1 AS a 
INNER JOIN table2 AS b 
  ON a.`name` = b.`name` AND a.`namespace` = b.`namespace` 
WHERE a.`updated` > b.`updated`

代入你的测试数据,这条语句会返回table1中namespace为test/test3的那条记录(它的updated比table2里的对应记录晚一天)。

场景2:找table1中所有在table2没有对应记录,或者有对应但更新的条目

如果需要包含table1独有的条目,就用LEFT JOIN配合OR条件:

SELECT a.`id`, a.`name`, a.`namespace`, a.`updated` 
FROM table1 AS a 
LEFT JOIN table2 AS b 
  ON a.`name` = b.`name` AND a.`namespace` = b.`namespace` 
WHERE b.`id` IS NULL OR a.`updated` > b.`updated`

这里用b.id IS NULL判断table2中没有匹配的记录,再加上更新的条件,就能覆盖所有你可能需要的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:30:53