三表ID关联查询问题:修正Full Outer Join的跨表匹配缺陷
多表ID关联的正确实现方案
问题场景
三张表各含独立ID列,需关联生成包含各表ID及对应匹配项的结果表,要求同一ID在多表中存在时合并为一行,不存在则留空。
原始表数据
表A:
| id_A |
|---|
| 1 |
| 2 |
| 4 |
表B:
| id_B |
|---|
| 1 |
| 2 |
| 3 |
表C:
| id_C |
|---|
| 1 |
| 3 |
| 4 |
期望结果
| id_A | id_B | id_C |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | |
| 4 | 4 | |
| 3 | 3 |
当前实现问题
使用以下全外连接语句时,无法关联仅存在于表B和表C的ID(如ID=3),导致生成两条冗余记录:
SELECT * FROM A FULL OUTER JOIN B ON id_A = id_B FULL OUTER JOIN C ON id_A = id_C
错误结果:
| id_A | id_B | id_C |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 2 | |
| 4 | 4 | |
| 3 | ||
| 3 |
解决方案
方案1:调整全外连接的关联条件
第三次连接时,使用COALESCE函数取表A或表B中的非空ID,与表C的ID匹配,确保仅存在于B、C的ID能合并为一行:
SELECT A.id_A, B.id_B, C.id_C FROM A FULL OUTER JOIN B ON A.id_A = B.id_B FULL OUTER JOIN C ON COALESCE(A.id_A, B.id_B) = C.id_C;
方案2:先收集所有唯一ID再左连接
先通过UNION获取三张表的所有唯一ID,再以此为基础分别左连接三张表,这种方式逻辑更清晰,也能覆盖所有ID场景:
SELECT A.id_A, B.id_B, C.id_C FROM ( SELECT id_A AS id FROM A UNION SELECT id_B AS id FROM B UNION SELECT id_C AS id FROM C ) AS all_ids LEFT JOIN A ON all_ids.id = A.id_A LEFT JOIN B ON all_ids.id = B.id_B LEFT JOIN C ON all_ids.id = C.id_C;
内容的提问来源于stack exchange,提问作者Barnaby Cooper
相关产品推荐
相关产品推荐

