技术与生活 / 一篇记录
LEFT JOIN 后记录少了,问题可能在 WHERE
左连接先保留左侧记录,并用空值补齐没有匹配的右侧字段。若随后要求右表字段满足某个普通条件,这些空值记录又会在 WHERE 阶段被排除。
先明确这里的区别
左连接可以保留没有匹配项的左表记录,右表字段此时为 NULL。
查询示例以 SQLite 为例;notes 为测试表,包含 id、title、score、category、created_at 字段。
SELECT n.id, p.title FROM notes n LEFT JOIN notes p ON p.id = n.id + 1 ORDER BY n.id;
怎样判断处理正确
检查最后一条记录在没有匹配项时是否仍存在。
先不加右侧条件,确认未匹配记录存在,再逐个加入过滤。条件写在 ON 还是 WHERE 取决于业务含义,不能仅凭“结果多一点”选择写法。
多对多关系可能让连接结果中的左表记录重复出现。这不一定是数据库出错,而是匹配到了多条右表记录。统计前先确定需要的是匹配行数还是独立对象数。
需要留意的是,把右表过滤条件直接放进 WHERE,可能意外排除未匹配记录。
参考:SQL 文档。