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

JPQL左连接中ON子句与WHERE子句条件差异及查询示例对比

JPQL与SQL连接查询中ON和WHERE子句的差异分析

1. JPQL左连接场景下,ON子句与WHERE子句放置条件的差异

  • 过滤阶段不同:ON子句的条件在连接操作执行时生效,先筛选关联表中符合条件的记录,再和主表做左连接;WHERE子句是在所有连接操作完成后,对最终的结果集做过滤。
  • 对主表记录的保留逻辑不同:左连接中,ON子句的条件不会丢弃主表记录——哪怕关联表没有匹配的符合条件的记录,主表记录依然会被保留,关联表对应字段填充为NULL;但WHERE子句的条件会直接剔除主表中那些关联表字段不符合条件的记录,相当于把左连接变相改成了内连接。
  • 逻辑执行优先级不同:数据库会优先处理所有连接的ON条件,完成连接操作后,再应用WHERE子句的过滤规则。

2. 两个SQL查询的处理过程与结果差异

注:原查询存在笔误,第二个LEFT JOIN的目标表应为Table C(否则引用C.id逻辑不通),以下基于修正后的查询分析:

查询1代码

SELECT * from Table A 
Inner JOIN Table B ON A.id = B.id 
LEFT JOIN Table C ON A.id = C.id AND (C.status IS NULL OR C.status <> 3) 
WHERE A.status = 1 and B.status = 1

查询2代码

SELECT * from Table A 
Inner JOIN Table B ON A.id = B.id 
LEFT JOIN Table C ON A.id = C.id 
WHERE A.status = 1 and B.status = 1 AND (C.status IS NULL OR C.status <> 3)

两者的核心差异:

  • 处理流程差异:
    • 查询1:先对C表应用(C.status IS NULL OR C.status <>3)的筛选,再将符合条件的C表记录与A表左连接;最后过滤出A、B表status=1的记录。
    • 查询2:先将A表与C表全量左连接(仅匹配id),再对整个结果集同时过滤A、B的status=1,以及C表的(C.status IS NULL OR C.status <>3)条件。
  • 返回结果差异:
    • 查询1中,只要A、B满足WHERE条件,哪怕C表没有匹配的符合条件的记录(或无匹配记录),这条主表记录都会被保留,C表字段填充为NULL。
    • 查询2中,若A、B满足条件,但C表存在匹配记录且status=3,这条记录会被WHERE条件剔除,最终结果里不会包含这类数据,左连接的“保留主表所有符合条件记录”的特性被削弱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:10:33