无基准主表时如何通过LEFT JOIN关联3张表为统一结果集
无固定主表的三表LEFT JOIN实现方案
核心逻辑:在没有明确单一业务主表的场景下,若直接选取A/B/C中任意一张表作为关联起点,必然会丢失其他表独有的id记录。正确的实现方式是先提取三张表所有关联键(id)的去重全集,将该全集作为临时基准主表,再依次对三张表执行左关联,即可得到跨表覆盖全量id的统一结果集。
可直接执行的Oracle环境SQL
WITH base_all_id AS ( -- 生成三张表id的去重全集作为临时基准 SELECT id FROM A UNION SELECT id FROM B UNION SELECT id FROM C ) SELECT bi.id, a.val AS a_val, b.val AS b_val, c.val AS c_val FROM base_all_id bi LEFT JOIN A a ON bi.id = a.id LEFT JOIN B b ON bi.id = b.id LEFT JOIN C c ON bi.id = c.id ORDER BY bi.id;
执行后匹配预期的结果集
| id | a_val | b_val | c_val |
|---|---|---|---|
| 1 | a | null | null |
| 2 | b | d | null |
| 3 | c | e | g |
| 4 | null | f | h |
| 5 | null | null | i |
实现关键注意点
- 生成基准集时必须使用
UNION而非UNION ALL,目的是对跨表重复的id做去重,避免后续关联时出现行数翻倍的笛卡尔积问题 - 所有左关联的连接条件需严格基于id匹配,无额外筛选逻辑时,最终返回的总行数与基准集的去重id数完全一致
- 若三张表数据量较大,可提前为id列建立单列索引,降低基准集生成、关联查询阶段的全表扫描开销
内容的提问来源于stack exchange,提问作者user3345547
相关产品推荐
相关产品推荐

