有一个表包含飞行员和他们能够驾驶的飞机,还有一个表包含停在飞机棚中的飞机。需要找出能够驾驶飞机棚中每一架飞机的飞行员姓名。 /* 在这个示例中,史密斯和威尔逊是两个能够驾驶飞机棚中所有飞机的驾驶员。注意韩士与塞克会驾驶Piper cub,但是现在没有这种型号。 */ create database 飞行员与飞机; go use 飞行员与飞机; create table 飞行技巧表 ( 飞行员姓名 char(15) not null, 飞机型号 char(15) not null, primary key(飞行员姓名,飞机型号) ); go insert into 飞行技巧表 values('塞克','Piper cub') insert into 飞行技巧表 values('韩士','B-52 Bomber') insert into 飞行技巧表 values('韩士','F-14 Fighter') insert into 飞行技巧表 values('韩士','piper cub') insert into 飞行技巧表 values('杰姆','B-52 Bomber') insert into 飞行技巧表 values('杰姆','F-14 Fighter') insert into 飞行技巧表 values('史密斯','B-1 Bomber') insert into 飞行技巧表 values('史密斯','B-52 Bomber') insert into 飞行技巧表 values('史密斯','F-14 Fighter') insert into 飞行技巧表 values('威尔逊','B-1 Bomber') insert into 飞行技巧表 values('威尔逊','B-52 Bomber') insert into 飞行技巧表 values('威尔逊','F-14 Fighter') insert into 飞行技巧表 values('威尔逊','F-17 Fighter') go create table 飞机棚 ( 飞机型号 char(15) primary key); go insert into 飞机棚 values('B-1 Bomber') insert into 飞机棚 values('B-52 Bomber') insert into 飞机棚 values('F-14 Fighter') go /* 在这个示例中,史密斯和威尔逊是两个能够驾驶飞机棚中所有飞机的驾驶员。注意韩士与塞克会驾驶Piper cub,但是现在没有 这种型号。 */ use 飞行员与飞机; select distinct 飞行员姓名 from 飞行技巧表 a where Not Exists ( select 飞机型号 from 飞机棚 f1 where Not Exists ( select * from 飞行技巧表 b where f1.飞机型号=b.飞机型号 and a.飞行员姓名=b.飞行员姓名 ) ) /* 飞行员姓名 --------------- 史密斯 威尔逊 (2 行受影响) */ 另外还有一种方法,而查询开销更少: select distinct 飞行员姓名 from 飞行技巧表 f1 inner join 飞机棚 f2 on f1.飞机型号=f2.飞机型号 group by 飞行员姓名 having count(f1.飞机型号)=( select count(*) from 飞机棚 ); /*或者是*/ select distinct 飞行员姓名 from 飞行技巧表 f1,飞机棚 f2 where f2.飞机型号=f1.飞机型号 group by 飞行员姓名 having COUNT(f1.飞机型号)=(select COUNT(*) from 飞机棚); 同时执行第一种方法跟第二种方法,结果的执行开销统计截图如下: