SQL两次关联同一张表查询时数据行缺失问题排查
问题原因分析
你写的SQL存在两个核心问题:
- 用了默认的
INNER JOIN(简写为JOIN)关联两次表2,INNER JOIN本身就会把没有任何表2关联记录的用户直接排除,不会出现在结果中 - 你把
value_id的过滤条件写在了WHERE子句中,这要求用户必须同时存在value_id=1和value_id=2的两条关联记录才会被保留,只要缺其中任意一类城市的关联数据,整行用户记录都会被过滤,这就是id为2的Smith数据丢失的原因
修正后的写法
SELECT a.id, a.name, b.value AS city_1, c.value AS city_2 FROM table1 AS a LEFT JOIN table2 AS b ON a.id = b._id AND b.value_id = 1 LEFT JOIN table2 AS c ON a.id = c._id AND c.value_id = 2
修正逻辑说明
- 把
INNER JOIN替换为LEFT JOIN,会保留左表table1的全部4条用户记录,哪怕右表没有匹配的关联项,对应的城市字段会自动返回NULL,符合你的输出要求 - 把
value_id的过滤条件从WHERE移到对应LEFT JOIN的ON子句中,是在关联阶段就先过滤表2的分类,不会因为用户缺少某类城市的关联数据就被整行过滤
内容的提问来源于stack exchange,提问作者Raja
相关产品推荐
相关产品推荐

