如何通过单条SQL查询获取关联飞机或船只的行程数据?
解决方法:单条SQL获取关联飞机/船只或两者的行程
这问题其实挺常见的,咱们可以用两种实用的思路来实现,我给你详细拆解下:
方法一:用UNION合并结果
UNION会自动合并两个查询的结果并去除重复行,刚好匹配你要的「关联飞机、船只或同时关联两者」的需求——如果某个行程同时关联了飞机和船,两个子查询都会返回它,UNION会帮你合并成一条唯一的记录。
对应的SQL语句:
SELECT trip.* FROM trip INNER JOIN plane ON plane.trip_id = trip.id UNION SELECT trip.* FROM trip INNER JOIN boat ON boat.trip_id = trip.id;
方法二:用LEFT JOIN加条件过滤
通过LEFT JOIN把主表和两个子表关联起来,再筛选出至少有一个子表记录存在的行程,最后用DISTINCT去重,避免同时关联两个子表时出现重复的行程记录。
对应的SQL语句:
SELECT DISTINCT trip.* FROM trip LEFT JOIN plane ON plane.trip_id = trip.id LEFT JOIN boat ON boat.trip_id = trip.id WHERE plane.id IS NOT NULL OR boat.id IS NOT NULL;
两种方法的小差异
- 如果子表数据量不大,两种方法都能顺畅运行;
- 如果子表数据量较大,
UNION的性能可能更优,因为它是分别执行两个小查询再合并,而LEFT JOIN会先生成包含所有关联组合的临时结果集,再去重过滤。
内容的提问来源于stack exchange,提问作者cefada
相关产品推荐
相关产品推荐

