如何修改SQL查询以显示飞行里程为0的未飞行飞行员?
解决方案:显示里程为0的未飞行飞行员
原查询使用内连接(JOIN),仅能返回同时存在于三个表中的记录——也就是有飞行记录的飞行员,因此无法覆盖从未执行过飞行任务的飞行员。要解决这个问题,需调整连接类型与顺序,具体如下:
关键修改要点
- 以
TPilots表为起点,使用**左连接(LEFT JOIN)**关联TPilotFlights,确保所有飞行员都被保留,哪怕没有对应的飞行关联记录 - 继续左连接
TFlights表,避免因飞行员有飞行关联但航班数据缺失导致的记录丢失(业务场景中虽少见,但左连接更具鲁棒性) - 用
COALESCE()函数将SUM()返回的NULL值转换为0,因为未飞行的飞行员没有里程数据,SUM会默认返回NULL - 移除
DISTINCT,因为GROUP BY TP.intPilotID已保证每组唯一,无需额外去重
修正后的SQL查询
SELECT CONCAT(TP.intPilotID, ' ', TP.strFirstName, ' ', TP.strLastName, ', ', COALESCE(SUM(TF.intMilesFlown), 0)) AS MILES FROM TPilots AS TP LEFT JOIN TPilotFlights AS TPF ON TP.intPilotID = TPF.intPilotID LEFT JOIN TFlights AS TF ON TPF.intFlightID = TF.intFlightID GROUP BY TP.intPilotID, TP.strFirstName, TP.strLastName
逻辑说明
- 左连接顺序:从飞行员表出发逐步关联下游表,确保无飞行记录的飞行员不会被过滤
COALESCE作用:直接将无里程数据的结果替换为0,满足需求中的里程显示要求GROUP BY:按飞行员唯一标识及姓名分组,保证每个飞行员仅返回一条汇总记录
内容的提问来源于stack exchange,提问作者John Webb
相关产品推荐
相关产品推荐

