SQL逻辑解析:查询驾驶公司所有空客的飞行员nopil编号
这条SQL的实现逻辑拆解
首先明确涉及的3张表作用:
- PILOTE表:飞行员基础表,
NOPIL为飞行员唯一编号 - AVION表:飞机基础表,
NOAV为飞机唯一编号,NOMAV为飞机型号名称 - VOL表:飞行班次表,记录每趟航班的执飞飞行员、执飞飞机等信息,
NOPIL关联飞行员表,NOAV关联飞机表
这条SQL用的是全称量词转计数匹配的经典实现思路,要找「开过所有空客的飞行员」,等价于找「该飞行员开过的不同空客飞机数量 = 公司所有空客飞机总数量」的飞行员,逐段拆解如下:
1. 过滤空客的执飞记录
FROM vol v, avion a WHERE v.noav = a.noav AND nomav = 'Airbus'
这部分是将飞行班次表和飞机表做内连接,匹配每趟班次对应的飞机信息,然后只保留执飞机型为空客的记录,得到的临时结果是所有空客飞机的历史执飞记录,每条记录都带执飞飞行员编号、对应飞机编号。
2. 按飞行员分组统计开过的空客数量
GROUP BY nopil HAVING COUNT(distinct noav) = (子查询结果)
按飞行员编号分组后,对每个飞行员统计他开过的不同空客飞机的数量:加distinct是为了避免同一个飞行员多次驾驶同一架空客被重复计数,保证每架空客只算一次。
3. 子查询获取空客总数量基准
(SELECT COUNT(*) FROM avion WHERE nomav = 'Airbus')
这部分直接统计当前公司所有空客飞机的总数量,作为匹配的基准值。
4. 结果过滤
当某个飞行员开过的不同空客数量刚好等于公司空客总数量时,就说明他驾驶过所有空客机型,符合查询要求。最外层加DISTINCT是冗余保险,避免分组后出现重复的飞行员编号。
内容的提问来源于stack exchange,提问作者Amine Zahrani
相关产品推荐
相关产品推荐

