为何该MySQL查询使用自左连接?与普通查询是否等价?
为什么该查询使用自左连接?
首先明确:你认为的普通查询和原查询并不等价,原查询的目的是筛选出更严格的结果集。
原查询的作用
原查询的逻辑是:
从
survey_condition_filter表中,选取type为2000、2001、2002的记录,但要排除掉那些同一个survey_set_id下存在type=3002记录的条目。
而你写的普通查询只是单纯选取type在2000-2002的所有记录,完全不考虑同survey_set_id下是否存在type=3002的记录,这是两者的核心区别。
原查询的工作原理拆解
SELECT it1.survey_set_id, it1.type, it1.value FROM survey_condition_filter it1 LEFT JOIN survey_condition_filter it2 ON(it1.survey_set_id = it2.survey_set_id AND it2.type = 3002) WHERE it1.type IN (2000, 2001, 2002) AND it2.value IS NULL;
自左连接的作用:
it1作为主表,先筛选出所有type为2000、2001、2002的记录- 通过
LEFT JOIN关联同一张表的it2,关联条件是**同一个survey_set_id**且it2.type=3002 - 左连接的特性是:即使
it2中没有匹配的记录,it1的记录也会被保留,此时it2的所有字段值都是NULL
WHERE条件的过滤:
it2.value IS NULL这个条件,就是专门筛选出那些在it2中找不到匹配记录的it1条目——换句话说,就是该survey_set_id下不存在type=3002的记录。
结合表结构理解
从表结构可以看到,survey_set_id、type等多个字段共同构成主键,这意味着同一个survey_set_id下可以存在多条不同type的记录。比如某个survey_set_id=123下,既可以有type=2000的记录,也可以有type=3002的记录。原查询就是要把这类同时存在的type=2000记录排除掉,而普通查询会把它保留。
内容的提问来源于stack exchange,提问作者user15980977
相关产品推荐
相关产品推荐

