如何编写SQL语句筛选从未飞往指定城市的乘客?现有查询语句修正请求
修正筛选从未飞往指定城市乘客的SQL语句
首先得指出你原SQL语句的两个核心问题:
- 用
INNER JOIN会直接过滤掉没有任何机票记录的乘客,但咱们的需求是要包含这些从未乘坐过任何航班的乘客(他们显然也没去过东京); WHERE NOT ci.id = 'Tokyo'只是排除了乘客飞往东京的那条记录,但如果乘客有其他飞往别的城市的记录,依然会被查出来,这根本不是“从未飞往东京”的逻辑。
下面给你两种靠谱的解决方案,按需选择:
方案1:使用NOT EXISTS(推荐,逻辑清晰且性能更优)
SELECT p.docReference, p.name, p.surname, p.nationality FROM dbo.Passenger p WHERE NOT EXISTS ( -- 子查询检查该乘客是否有飞往东京的机票记录 SELECT 1 FROM dbo.Ticket ti -- 这里注意:需要确认Ticket和Airport的关联字段,我假设是airportId,你要根据实际库结构调整 INNER JOIN dbo.Airport a ON ti.airportId = a.id INNER JOIN dbo.City ci ON a.city = ci.id WHERE ti.docReference = p.docReference AND ci.id = 'Tokyo' -- 指定要排除的目标城市ID )
这个写法的逻辑很直接:找出所有不存在飞往东京机票记录的乘客,完全符合需求,还能自然包含从未买过票的乘客。
方案2:使用LEFT JOIN + IS NULL
SELECT p.docReference, p.name, p.surname, p.nationality FROM dbo.Passenger p LEFT JOIN dbo.Ticket ti ON p.docReference = ti.docReference -- 同样要确认Ticket和Airport的关联字段 LEFT JOIN dbo.Airport a ON ti.airportId = a.id -- 只左连接到东京的城市记录 LEFT JOIN dbo.City ci ON a.city = ci.id AND ci.id = 'Tokyo' -- 筛选:要么没有任何机票,要么有机票但没有东京的记录 WHERE ti.docReference IS NULL OR ci.id IS NULL
额外提醒
- 你原语句里选了很多和乘客无关的字段(比如机场类型、城市ID、国家代码这些),如果只是要乘客信息,建议只保留乘客相关字段,既清晰又高效;
- 一定要确认表之间的关联字段是否正确!比如
Ticket和Airport的关联,你原语句里没写这部分,这是关键的缺失项,必须根据你的实际数据库结构调整。
内容的提问来源于stack exchange,提问作者Gp P
相关产品推荐
相关产品推荐

