【问题标题】:SQL: how to filter results beyond GROUP BYSQL:如何过滤 GROUP BY 之外的结果
【发布时间】:2017-04-05 18:28:59
【问题描述】:

原问题

以下关系跟踪航空公司航班信息:

飞机aircraft_number、aircraft_make、cruisingrange)

认证pilot_idaircraft_number

飞行员pilot_id、pilot_name、薪水)

请注意,italic 属性表示主键。在该计划中,每位飞行员都获得了某些飞机的认证。以 SQL 格式编写以下每个查询。

(ii) 找出可以驾驶航程超过 2,000 英里的飞机但未在任何波音飞机上获得认证的飞行员的姓名。

有人可以帮助我了解如何为此编写查询吗?

我的猜测是首先join PILOTCERTIFIED,然后是joinAIRCRAFT,然后是GROUP BY PILOT.pilot_id,但除此之外,我不确定如何过滤pilot_id 以排除那些没有至少有一架航程不低于 2000 且没有aircraft_make“波音”的飞机?

非常感谢!

【问题讨论】:

  • 欢迎来到 Stackoverflow!要获得有用的答案,请附上您迄今为止尝试解决此问题的代码或步骤,以便我们帮助您调试或改进它。
  • 请不要张贴(链接到)文本或代码的图像。当链接断开时,没有人可以使用这个问题。此外,文本在复制时更有用。

标签: mysql sql


【解决方案1】:

应该这样做:

select p.pilot_name
  from pilot p
  join certified c
    on p.pilot_id = c.pilot_id
  join aircraft a
    on c.aircraft_number = a.aircraft_number
  where a.cruisingrange > 2000
    and p.pilot_id not in (
          select c.pilot_id
            from certified c
            join aircraft a
              on c.aircraft_number = a.aircraft_number
            where a.aircraft_make = 'BOEING'
        )
  group by p.pilot_id

【讨论】:

  • 感谢乔治的回复!但是,我想我对这个问题的解释可能会有所不同。假设飞行员“汤姆”分别获得了“波音”和“空客”两架飞机的认证。假设两架飞机的巡航范围 > 2000,您的查询将返回“汤姆”(不应返回,因为汤姆有一架“波音”飞机,尽管他也有一架非“波音”飞机)。有没有办法解决这个问题?
  • 感谢 Georgi,这很有意义!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多