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

SQL LEFT JOIN日期过滤放ON与WHERE子句结果差异原因咨询

两段SQL返回结果差异的核心原因

二者的差异本质是LEFT JOIN中ON子句和WHERE子句的作用逻辑不同,具体差异如下:

  • SQL A的日期过滤条件写在ON连接子句中
    LEFT JOIN的核心规则是无条件保留左表(这里是Table A)的全部行,ON子句仅用来判断左表行是否能匹配到右表(Table B)的行。
    这里的a.date = date_add('day', -1, CURRENT_DATE)仅作为匹配右表的条件:如果左表行的日期是昨天,才会尝试匹配对应ID的B表行;如果左表行的日期不是昨天,只会导致匹配不到B表行,B表相关字段返回NULL,左表的所有行还是会全部保留,所以最终返回Table A的所有日期数据。
  • SQL B的日期过滤条件写在WHERE子句中
    WHERE子句是在左右表连接完成后,对整个关联结果集做全局过滤的规则。此时不管是左表还是右表的字段,只要不满足WHERE条件的行都会被直接剔除。
    这里的a.date = date_add('day', -1, CURRENT_DATE)会过滤掉所有左表日期不等于昨天的行,所以最终仅返回昨天的日期数据。

补充验证逻辑:你可以在SQL A的返回结果里观察非昨天日期的行对应的B表字段,所有值都会是NULL,就是因为这些行没有满足ON里的匹配条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:15:06