SQL Full Outer Join为何用相等关联条件?实际ID永不相等
Full Outer Join关联条件差异的原因解释
为什么t1.id = t2.id能得到正确结果
因为两张表的id完全没有交集,t1.id = t2.id这个关联条件根本匹配不到任何成对的行。Full Outer Join的逻辑是保留左表(t1)所有未匹配的行、右表(t2)所有未匹配的行,以及匹配的行——这里没有匹配行,所以最终结果就是t1的所有行(t2字段全为NULL)加上t2的所有行(t1字段全为NULL)。再通过WHERE筛选name符合模式的行,自然就得到了两表中各自符合条件的记录,正好满足需求。
为什么t1.id != t2.id会返回空数据
当关联条件是t1.id != t2.id时,由于两表id无交集,t1里的每一行都能和t2里的所有行满足这个条件,结果会生成t1行数 × t2行数的笛卡尔积。而且Full Outer Join不会保留任何单独的t1或t2行——因为所有t1行都匹配到了t2行,所有t2行也都匹配到了t1行,结果里的每一行都同时有t1和t2的非NULL数据。
如果你的需求是要两表各自符合条件的独立行,这类行在这个笛卡尔积结果里根本不存在;如果你的WHERE条件是要求t1.name和t2.name同时匹配模式(而实际没有这样的组合),就会直接返回空。
更高效的替代方案
既然两表id无交集,完全不需要用Full Outer Join,直接用UNION ALL合并结果更简单高效:
SELECT id, name FROM t1 WHERE name LIKE '你的指定模式' UNION ALL SELECT id, name FROM t2 WHERE name LIKE '你的指定模式';
内容的提问来源于stack exchange,提问作者WesternGun
相关产品推荐
相关产品推荐

