You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:27:45