MySQL实现4表ID全连接(FULL JOIN)查询结果不符问题求解
问题排查
- 关联条件逻辑错误:你写的右连接链条中,所有关联都绑定
d.id作为关联键,而doc表的ID最大值为3,当关联到prof表ID=4、5的记录时,d.id已经为NULL,后续用d.id关联sing、act表的条件必然不成立,导致ID>=4的各表记录无法正确匹配。 - 多表全连接实现逻辑错误:多表全连接不能直接通过「整链左连UNION整链右连」实现,这种写法只会保留左链的ID范围和最右表的ID范围,中间表超出ID范围的记录会全部丢失。
正确SQL语句
最简单的实现方式是先提取四个表的所有ID全集,再以ID全集为驱动表左连所有业务表,不会丢失任何ID对应的记录:
SELECT d.Name AS D, p.Name AS P, s.Name AS S, a.Name AS A FROM ( -- 合并四个表所有出现过的ID并去重 SELECT ID FROM doc UNION SELECT ID FROM prof UNION SELECT ID FROM sing UNION SELECT ID FROM act ) AS all_id LEFT JOIN doc d ON all_id.ID = d.ID LEFT JOIN prof p ON all_id.ID = p.ID LEFT JOIN sing s ON all_id.ID = s.ID LEFT JOIN act a ON all_id.ID = a.ID ORDER BY all_id.ID;
执行后输出结果与你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者Amitava Chowdhury
相关产品推荐
相关产品推荐

