Android SQLite中三张表的联合查询问题(无FULL OUTER JOIN)
解决方案:模拟FULL OUTER JOIN实现三表合并
由于SQLite不支持FULL OUTER JOIN,可以通过**LEFT JOIN + UNION ALL**的组合实现需求,确保所有id对应的记录都被保留,缺失字段自动填充NULL。
假设三张表的名称分别为:
vehicles(交通工具表):id,type,speed,weight,colorcars(汽车表):id,seats,doorsships(船只表):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
相关产品推荐
相关产品推荐

