SQL连续日期筛选问题:查询无结果的原因排查
错误排查分析
首先先明确你的数据表结构和测试数据:
create table weather( id int, recorddate date, temp int, primary key (id) ); insert into weather values (1, '2015-01-01', 10); insert into weather values (2, '2015-01-02', 15); insert into weather values (3, '2015-01-03', 20);
你的需求是筛选出温度高于前一天的日期对应的id,但原查询返回0条记录,问题出在两个关键逻辑错误上:
1. 日期与温度的比较逻辑完全颠倒
原查询的子查询里写了:
datediff(a.recorddate, b.recorddate) = -1 and b.temp > a.temp
datediff(a.recorddate, b.recorddate) = -1意味着a.recorddate = b.recorddate - 1天,也就是b是a的后一天,而不是你需要的“前一天”。如果要找a的前一天记录b,应该是datediff(a.recorddate, b.recorddate) = 1(a比b晚一天)。b.temp > a.temp是在判断后一天的温度比当前天高,这和你“当前天温度高于前一天”的需求完全相反,应该写成a.temp > b.temp。
2. 主查询的匹配逻辑错误
你误以为where id = (select id from weather b ...)是在“获取符合条件的id”,但实际上这个条件的逻辑是:主查询中每条记录的id必须等于子查询返回的id。
但子查询返回的是b的id(后一天的记录id),而a和b是不同的记录(日期不同,主键id唯一),所以这个等式永远不可能成立,自然没有符合条件的记录返回。
简单来说,你把“要找的目标记录”和“对比的参照记录”搞混了,同时错误地用主键id的相等匹配来关联两个完全不同的记录,导致查询逻辑完全失效。
内容的提问来源于stack exchange,提问作者Cheng
相关产品推荐
相关产品推荐

