SQL左连接查询:如何返回首表全量记录并展示次表无匹配空值
问题根因
当前写法仅返回2条匹配记录的核心原因是:将次表的筛选条件放置在WHERE子句中,直接导致LEFT JOIN的左表全量保留效果失效。
LEFT JOIN的执行逻辑是保留左表所有行,匹配关联右表符合条件的行。如果在WHERE中写入second_table.applicant_id = 1的判断,会直接把左表保留的、无次表匹配数据的行全部过滤——因为这些行的second_table.applicant_id字段值为NULL,根本无法满足等值判断条件,最终结果就只剩有实际匹配的2条记录,丢失了FIRST_TABLE的全量数据。原写法中附带的按first_table.rid分组逻辑,无法解决WHERE条件提前过滤无匹配行的核心问题,当前需求下也无需额外加分组。
正确实现逻辑
要实现覆盖FIRST_TABLE全部rid、无匹配时按要求补值的效果,需要做两点调整:
- 把针对次表
applicant_id=1的筛选条件,从WHERE子句移动到LEFT JOIN的ON关联条件中
调整后,连接匹配阶段就只捞取符合applicant_id=1的次表记录,没有匹配的FIRST_TABLE行依然会被完整保留,次表对应字段自动填充为NULL - 对需要固定值的字段用
COALESCE做空值替换
连接后无匹配行的applicant_id为NULL,需要替换为目标值1,remarks字段保留NULL即可,完全匹配预期要求
参考实现SQL
SELECT ft.rid, ft.requirements, -- 将无匹配的NULL值替换为目标applicant_id=1 COALESCE(st.applicant_id, 1) AS applicant_id, st.remarks FROM FIRST_TABLE ft LEFT JOIN SECOND_TABLE st ON ft.rid = st.rid -- 次表的筛选条件放在ON中,不影响左表全量保留 AND st.applicant_id = 1 ORDER BY ft.rid
最终返回结果
上述SQL执行后会返回4行完全符合预期的记录:
- rid=1(2x2 pic):匹配次表已有记录,applicant_id=1,remarks为对应pass值
- rid=2(valid id):匹配次表已有记录,applicant_id=1,remarks为对应pass值
- rid=3(137 form):无匹配,applicant_id=1,remarks为NULL
- rid=4(app form):无匹配,applicant_id=1,remarks为NULL
内容的提问来源于stack exchange,提问作者Del
相关产品推荐
相关产品推荐

