如何修改SQL查询以获取未执行的飞船-目的地组合数据?
修改SQL查询以包含所有飞船-目的地组合
要获取所有飞船与目的地的组合(包括未执行过航班的组合),你需要先生成所有飞船和目的地的全量组合,再通过左连接关联后续的航班、乘客数据,具体修改如下:
SELECT ship.shipname, destination.name AS destination_name, COUNT(flight_person.person_id) AS passenger_count FROM ship CROSS JOIN destination LEFT JOIN flight ON flight.ship_id = ship.id AND flight.destination_id = destination.id LEFT JOIN flight_person ON flight_person.flight_id = flight.id LEFT JOIN person ON person.id = flight_person.person_id GROUP BY ship.shipname, destination.name ORDER BY ship.shipname, destination.name;
关键修改说明:
- CROSS JOIN destination:生成所有飞船和目的地的笛卡尔积,确保每个飞船都能和每个目的地形成一条记录,不管有没有实际航班。
- LEFT JOIN 后续表:用左连接替代原来的内连接,这样即使某个飞船-目的地组合没有对应的航班、乘客,也会保留这条记录,对应的乘客数会被统计为0。
- COUNT(flight_person.person_id):因为左连接后,没有乘客的记录中
flight_person.person_id为NULL,COUNT函数会忽略NULL值,自然得到0的结果。
修改后的查询会输出所有可能的飞船-目的地组合,其中未执行过航班的组合乘客数为0。
内容的提问来源于stack exchange,提问作者Alexey Ivanov
相关产品推荐
相关产品推荐

