无左表公共列的两次LEFT JOIN写法是否正确?需避免过滤效应
问题解答
你的两次LEFT JOIN写法是完全正确的,完全满足你“最后一次LEFT JOIN不对第一次产生过滤,结果集行数至少与仅第一次LEFT JOIN后的行数相等”的需求。
原因说明:
- LEFT JOIN的核心特性是保留左表的所有行,当右表没有匹配的记录时,对应右表的字段会填充为NULL,不会丢弃左表的任何一行。
- 你的SQL执行逻辑:
- 第一步
routes cr LEFT JOIN assets a:保留routes表的全部行,无论assets中是否存在对应imei的记录。 - 第二步基于第一步的结果集做
LEFT JOIN logistics log:此时左表是第一次JOIN后的完整结果,无论logistics中是否存在对应a.uc_id的记录,第一步的所有行都会被保留,仅当无匹配时log.start和log.end会显示为NULL。
- 第一步
最终结果集的行数完全等于仅执行第一次LEFT JOIN后的行数,不会因第二次JOIN产生过滤。
内容的提问来源于stack exchange,提问作者analyst92
相关产品推荐
相关产品推荐

