SQL多表查询:关联失败时用NULL填充而非省略整行
解决方案:保留主表所有行并填充NULL
你当前的查询用的是隐式内连接(逗号分隔表+WHERE条件),这种连接只会返回所有表都满足匹配条件的行,不匹配的行直接被过滤,所以只得到了id=1的结果。
要实现保留table_a的所有行,不匹配的字段用NULL填充,得用LEFT JOIN(左外连接)——它会保留左表的全部记录,右表无匹配时对应字段自动填充NULL。
正确的SQL语句如下:
select a.id, c.name from table_a a left join table_b b on a.id = b.id left join table_c c on b.name = c.name;
逻辑说明
- 以
table_a作为左表,左连接table_b:确保table_a的所有id都被保留(你的案例里table_b和table_a的id是全匹配的,但写法上保持左连接逻辑更通用)。 - 再用
table_b的name字段左连接table_c:当table_c中没有对应name值时,c.name就会显示为NULL。
执行后会得到你期望的结果:
| id | name |
|---|---|
| 1 | a1 |
| 2 | NULL |
| 3 | NULL |
内容的提问来源于stack exchange,提问作者culpinha
相关产品推荐
相关产品推荐

