在 SQL 中,LEFT JOIN(左连接) 本身是“保留左表全部记录”的连接方式,所谓“错误”通常不是语法错误,而是结果不符合预期(如数据翻倍、条件写错导致变成内连接、NULL 处理不当等)。
下面从常见错误 → 避免方法来系统说明。
SELECT a.*, b.*
FROM A
LEFT JOIN B ON A.id = B.aid
WHERE B.status = 1;
问题:
WHERE B.status = 1 会过滤掉 B 为 NULL 的行,LEFT JOIN 变成“隐式 INNER JOIN”。
✅ 正确写法:条件放 ON 中
SELECT a.*, b.*
FROM A
LEFT JOIN B
ON A.id = B.aid
AND B.status = 1;
A 1条 → B 多条
LEFT JOIN 后,A 的记录会重复。
✅ 避免方式
SELECT A.*, B.cnt
FROM A
LEFT JOIN (
SELECT aid, COUNT(*) cnt
FROM B
GROUP BY aid
) B ON A.id = B.aid;
ON A.code = B.code
如果 code 有 NULL,NULL ≠ NULL,不会匹配。
✅ 处理方式
COALESCEON COALESCE(A.code,'') = COALESCE(B.code,'')
(仅在你明确知道语义时)
SELECT COUNT(*)
FROM A
LEFT JOIN B ON A.id = B.aid;
结果包含 B 为 NULL 的行,数量 ≠ A 行数(若一对多)
✅ 正确
SELECT COUNT(*) FROM A;
-- 或
SELECT COUNT(DISTINCT A.id) FROM A LEFT JOIN B ...
SELECT
A.id,
A.name,
B.col1,
B.col2
FROM A
LEFT JOIN B
ON A.id = B.aid
AND <B表过滤条件>
WHERE <A表过滤条件>;
原则:
WHEREONSELECT
A.id,
COALESCE(B.amount, 0) AS amount
FROM A
LEFT JOIN B ON A.id = B.aid;
ONDISTINCT 或子查询聚合如果你愿意,可以贴一段你的 SQL,我可以帮你具体指出“哪里容易出错 / 怎么改最稳”。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。