关联三张表时如何保留未匹配数据并过滤指定字段值?
问题分析与解决方案
你的SQL语句遗漏ID=3的数据,核心原因是左连接的子查询未指定别名,导致关联条件ON A.ID=C.ID实际引用的是原表C而非过滤后的子查询结果,变相把左连接变成了内连接,过滤掉了C表中无匹配的行。
修正后的SQL代码
SELECT DISTINCT A.ID, A.Age, B.Name, filtered_C.Code FROM A INNER JOIN B ON A.ID = B.ID LEFT JOIN ( SELECT ID, Code FROM C WHERE CODE IN ('AA','BB') ) AS filtered_C ON A.ID = filtered_C.ID
逻辑说明
INNER JOIN B:确保只有在B表中存在对应Name的ID才会被保留,直接剔除ID=4的数据- 左连接过滤后的
filtered_C子查询:仅保留C表中Code为AA/BB的数据,同时保证A+B中存在的ID(比如ID=3)即使在过滤后的C中无匹配,也会被保留,Code字段显示为NULL DISTINCT:去除关联过程中产生的重复行
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

