关于SQL中关联条件和筛选条件位置对结果的影响


I know, i know
地球另一端有你陪我




起因是在写模型时发现一个模型的结果数据量异常大
发现是我之前调整了关联条件导致的

数据异常的模型

    SELECT a.*
    FROM A表 a
    LEFT JOIN B表 b
    ON a.农户编号 = b.农户编号
    AND a.申请支付时间 = b.申请支付时间
    AND a.补贴项目名称 = b.补贴项目名称
    AND a.发放批次 = b.发放批次
    AND a.锁定状态 = '临时锁定'
    AND b.锁定状态 = '完全锁定'
    AND a.行政区划编码 = '610126'
    AND b.实发金额 IS NULL

原版逻辑

    SELECT a.*
    FROM A表 a
    LEFT JOIN B表 b
    ON (
        a.农户编号 = b.农户编号
        AND a.申请支付时间 = b.申请支付时间
        AND a.补贴项目名称 = b.补贴项目名称
        AND a.发放批次 = b.发放批次
        AND b.锁定状态 = '完全锁定')
    WHERE
        a.锁定状态 = '临时锁定'
        AND a.行政区划编码 = '610126'
        AND b.实发金额 IS NULL

以前有想过关联条件和筛选条件会不会影响最终结果
现在看来是会影响的,下面这句话是关键

在 LEFT JOIN 里,只要 a 表中的行满足 ON 子句的部分条件,
即使 b 表中没有完全匹配的行,a 表的行也会被保留在结果集中,
b 表对应的列会填充为 NULL。

相对的,在正常的内部关联中,对结果不会有太大结果
但是筛选条件放在 ON 中,会早一步筛选,提高运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值