仅使用CROSS JOIN能否完全替代其他JOIN类型的功能?
能否用CROSS JOIN加过滤替代其他JOIN?
结论:INNER JOIN可以完全替代,但LEFT/RIGHT/FULL JOIN在涉及NULL的边缘场景下无法仅通过CROSS JOIN+WHERE过滤完全模拟。
1. INNER JOIN:完全等价
INNER JOIN的本质就是两个表做笛卡尔积(CROSS JOIN)后,过滤出满足连接条件的行。因此:
-- INNER JOIN写法 SELECT * FROM A INNER JOIN B ON A.id = B.id -- 等价的CROSS JOIN+过滤写法 SELECT * FROM A CROSS JOIN B WHERE A.id = B.id
两者在所有场景(包括NULL的情况,因为NULL=NULL会被WHERE过滤)下结果完全一致。
2. LEFT JOIN:存在边缘场景无法替代
LEFT JOIN的核心是保留左表所有行,右表匹配则显示对应数据,不匹配则填充NULL。如果仅用CROSS JOIN+WHERE过滤,无法准确实现这一逻辑:
- 假设左表A有一行
id=NULL,右表B中没有任何行满足A.id=B.id(包括B中无NULL行),LEFT JOIN会返回A的这行,B列全为NULL。 - 若尝试用
WHERE A.id = B.id OR B.id IS NULL,会错误地将B中所有id=NULL的行与A的每一行匹配,结果行数远超预期。 - 若想准确模拟,必须结合
NOT EXISTS或UNION ALL,但这已经超出了“仅CROSS JOIN搭配过滤条件”的范围。
3. RIGHT JOIN:同LEFT JOIN的逻辑
RIGHT JOIN是保留右表所有行,同理,仅靠CROSS JOIN+WHERE过滤无法处理右表中无匹配的行(尤其是涉及NULL的情况),必须额外逻辑补充。
4. FULL JOIN:更无法直接替代
FULL JOIN同时保留左右表所有行,不匹配的一侧填充NULL。仅用CROSS JOIN+WHERE过滤既无法保留左表无匹配的行,也无法保留右表无匹配的行,必须结合UNION ALL和子查询才能模拟,完全不属于“仅CROSS JOIN+过滤”的范畴。
关键边缘案例:连接条件含NULL时的差异
当连接字段存在NULL值时,SQL中NULL = NULL的结果是UNKNOWN,会被WHERE子句过滤,但外连接会保留未匹配的行。例如:
- 表A有行
(id: NULL),表B有行(id: NULL) - INNER JOIN和CROSS JOIN+WHERE都不会返回这行
- LEFT JOIN会返回A的行,B列全为NULL(因为
NULL=NULL不满足ON条件,视为无匹配) - 若用CROSS JOIN+WHERE无法区分“无匹配”和“匹配到NULL行”,导致结果错误。
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

