You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android SQLite中三张表的联合查询问题(无FULL OUTER JOIN)

解决方案:模拟FULL OUTER JOIN实现三表合并

由于SQLite不支持FULL OUTER JOIN,可以通过**LEFT JOIN + UNION ALL**的组合实现需求,确保所有id对应的记录都被保留,缺失字段自动填充NULL。

假设三张表的名称分别为:

  • vehicles(交通工具表):id, type, speed, weight, color
  • cars(汽车表):id, seats, doors
  • ships(船只表):id, waterDisplaced

最终SQL语句

-- 1. 关联所有交通工具记录,匹配对应的汽车、船只数据
SELECT 
    v.id,
    v.type,
    v.speed,
    v.weight,
    v.color,
    c.seats,
    c.doors,
    s.waterDisplaced
FROM vehicles v
LEFT JOIN cars c ON v.id = c.id
LEFT JOIN ships s ON v.id = s.id

UNION ALL

-- 2. 补充仅存在于汽车表、不存在于交通工具表的记录
SELECT 
    c.id,
    NULL AS type,
    NULL AS speed,
    NULL AS weight,
    NULL AS color,
    c.seats,
    c.doors,
    NULL AS waterDisplaced
FROM cars c
WHERE NOT EXISTS (SELECT 1 FROM vehicles v WHERE v.id = c.id)

UNION ALL

-- 3. 补充仅存在于船只表、不存在于交通工具表的记录
SELECT 
    s.id,
    NULL AS type,
    NULL AS speed,
    NULL AS weight,
    NULL AS color,
    NULL AS seats,
    NULL AS doors,
    s.waterDisplaced
FROM ships s
WHERE NOT EXISTS (SELECT 1 FROM vehicles v WHERE v.id = s.id);

逻辑说明

  • 第一部分:通过两次LEFT JOIN关联所有交通工具记录,没有匹配到的汽车/船只字段自动填充NULL。
  • 第二部分:提取仅在汽车表存在的记录,手动将交通工具相关字段设为NULL。
  • 第三部分:提取仅在船只表存在的记录,手动将交通工具、汽车相关字段设为NULL。
  • 使用UNION ALL而非UNION,避免无意义的去重操作,提升查询效率。

内容的提问来源于stack exchange,提问作者Hooch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:33:19