多表连接查询结果行混合,如何实现每个关联结果单独成行?
问题分析与解决方案
你的查询之所以出现结果行混乱,核心原因是同时对Table_B和Table_C执行左连接——这种写法会让两个表的匹配记录产生笛卡尔积,导致来自Table_B和Table_C的结果被错误地混合在同一行里。举个例子:如果Table_B有2条匹配Table_A.id=1的记录,Table_C有3条,最终会得到2×3=6条交叉组合的行,而不是你期望的5条(2+3)独立行。
你想要的是把Table_A与Table_B的匹配结果、Table_A与Table_C的匹配结果纵向分开成单独行,这时候JOIN(横向拼接表)确实不是正确的实现方式,应该用UNION ALL来合并两个独立的查询结果:
-- 获取Table_A与Table_B的匹配行,Table_C列设为NULL SELECT Table_A.id AS a_id, Table_B.id AS b_id, NULL AS c_id FROM Table_A LEFT JOIN Table_B ON Table_B.id_a = Table_A.id WHERE Table_A.id = 1 UNION ALL -- 获取Table_A与Table_C的匹配行,Table_B列设为NULL SELECT Table_A.id AS a_id, NULL AS b_id, Table_C.id AS c_id FROM Table_A LEFT JOIN Table_C ON Table_C.id_a = Table_A.id WHERE Table_A.id = 1
补充说明:
- 如果不需要保留Table_A中没有对应B/C记录的行,可以把
LEFT JOIN换成INNER JOIN,这样只会返回有匹配关联的结果行。 UNION ALL会保留所有重复行(如果有的话),如果需要去重可以用UNION,但通常UNION ALL性能更好,适合你的场景。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

