MySQL 5.7中`is not true`在LEFT JOIN WHERE中异常的原因咨询
LEFT JOIN后WHERE条件过滤不符合预期的原因
问题场景
我有两张表:
flaw表:包含uid字段userdata表:包含FlawId、IsDeleted(可为空)字段
想要获取所有未被用户标记为删除的flaw数据,执行了以下SQL:
select * from flaw f left join userdata `user` on f.uid = `user`.FlawId where `user`.IsDeleted is not true;
异常表现
示例数据
flaw表数据:
uid 1 2 3
userdata表数据:
FlawId | IsDeleted 1 | null
实际返回结果仅包含uid=1的行,但预期应返回全部3条flaw数据。将WHERE子句中的条件移至ON子句后,结果符合预期。
原因说明
这是MySQL 5.7.36版本的官方已知Bug。
正常逻辑下,LEFT JOIN后,flaw表中没有匹配userdata的行,其user.IsDeleted字段会为NULL,NULL IS NOT TRUE的判断结果应为真,这类行不应被过滤。但该版本的MySQL在处理这种可空布尔字段的IS NOT TRUE判断时出现异常,错误地将这些无匹配的行排除在外。
而将条件移至ON子句时,是在表关联阶段就筛选userdata中符合条件的记录,无匹配的flaw行依然会被保留,因此结果符合预期。
内容的提问来源于stack exchange,提问作者AlpacaMan
相关产品推荐
相关产品推荐

