写了一个简单的sql, sale_out 为业务表,acl_tenant为基础表,里面是机构数据。业务表有机构id,左关联机构表取名字。
现在是生产上有些测试号的数据,于是搞了一个“排除表”,v_report_ding_scm_excepted_tenant_ids , 使用 not exists去排除一些数据。
因为业务表有机构id,机构表也有,所以not exists里面的子查询,我觉得拿排除表去关联 业务表、 基础数据表都应该是一样的。结果自测了一下,使用机构表关联居然
限制不了数据!而使用业务表可以。看了下sql,我猜是左连接的问题,改成内连接果然没有问题。
但问题是left join后,在where里的条件是对连接后的结果集做限制,所以应该没有问题才对。而且我试了下,把 not exists 改成not in,即便前面写的是left join ,子查询怎么写都没有问题。
我个人倾向于不使用not in ,参考
这篇文章,not in子查询结果里如果有NULL,容易出现严重bug,我试了下确实是那种。而且not in还有性能问题(走不走索引)。
但是使用not exsits 居然又有上面说的问题,原因是为什么?感觉无法愉快的使用 not exists了。