如何通过SQL两次关联Locations表查询航班起降地点信息?
搞定特定出发地到目的地的航班SQL查询
嘿,其实INNER JOIN完全可以解决你的问题,大概率是你没注意到要两次关联Locations表,而且得用别名区分开出发地和目的地的数据源~
你看,Flights里的ID_Source和ID_Destination都关联Locations的ID,所以查询的时候得把Locations表调用两次,分别给个不一样的别名(比如source_loc代表出发地,dest_loc代表目的地),不然数据库根本不知道你要关联哪条数据。
给你写个完整的示例SQL:
SELECT f.ID AS flight_id, CONCAT(source_loc.Name, ' ', source_loc.Country) AS departure, CONCAT(dest_loc.Name, ' ', dest_loc.Country) AS destination FROM Flights f INNER JOIN Locations source_loc ON f.ID_Source = source_loc.ID INNER JOIN Locations dest_loc ON f.ID_Destination = dest_loc.ID -- 这里加你的筛选条件,比如查从Naples到London的航班 WHERE source_loc.Name = 'Naples' AND dest_loc.Name = 'London';
代码解释:
- 给
Flights起别名f,Locations分别起source_loc(出发地)和dest_loc(目的地),让SQL逻辑更清晰; - 用
CONCAT(不同数据库可能写法有差异:SQL Server用+,Oracle用||)把城市和国家拼接成你想要的格式; WHERE子句里直接筛选出发地和目的地的名称,就能拿到你要的特定航线航班。
如果想要输出成你示例里的那种带序号的格式,比如1st flight: Naples Italy | London England,可以用数据库的行号函数,比如MySQL的ROW_NUMBER():
SELECT CONCAT( ROW_NUMBER() OVER (ORDER BY f.ID), 'st flight: ', source_loc.Name, ' ', source_loc.Country, ' | ', dest_loc.Name, ' ', dest_loc.Country ) AS flight_info FROM Flights f INNER JOIN Locations source_loc ON f.ID_Source = source_loc.ID INNER JOIN Locations dest_loc ON f.ID_Destination = dest_loc.ID WHERE source_loc.Name = 'Naples' AND dest_loc.Name = 'London' ORDER BY f.ID;
这样就能完美得到你想要的输出格式啦~之前用INNER JOIN失败应该就是没给Locations表加别名,导致关联冲突了,试试上面的写法肯定没问题!
内容的提问来源于stack exchange,提问作者user1238784
相关产品推荐
相关产品推荐

