我使用2014,我有以下三个表:
员工
EMPID | FIRSTNAME
1 | JOHNNY
2 | DWAYNE
3 | TOM
4 | CHRISTIAN
5 | JACK
6 | BRAD
7 | ADAM
8 | MATT
9 | WILL
10 | JIM飞机
AID | NAME
1 | BOEING 1
2 | BOEING 2
3 | BOEING 3
4 | BOEING 4
5 | AIRBUS 1
6 | AIRBUS 2
7 | LEARJET
8 | DOUGLAS
9 | JUMBO
10 | ILYUSHIN经认证
EMPID | AID
1 | 1
1 | 2
1 | 3
1 | 4
4 | 2
4 | 3
7 | 1
7 | 2
7 | 5
7 | 6
8 | 7
8 | 8
8 | 9
2 | 10
2 | 1
2 | 9
3 | 10
5 | 8
5 | 9这个概念是有10名雇员和10架飞机。认证表确定哪些雇员被授权驾驶哪架飞机。但并不是所有的员工都是飞行员。我需要的是选择所有的飞行员谁没有资格证明使用波音。我试过但没有成功的地方如下:
SELECT DISTINCT FIRSTNAME
FROM EMPLOYEES
WHERE EMPID IN (SELECT EMPID
FROM CERTIFIED
WHERE AID NOT IN (SELECT AID FROM AIRCRAFTS WHERE NAME LIKE 'BOEING%'))给出了以下结果:
JACK
MATT
TOM
ADAM
DWAYNE这是错误的,因为根据认证表,亚当和德维恩被授权驾驶至少一架波音。
任何帮助都将不胜感激,谢谢提前!
发布于 2018-04-28 17:32:19
试试这个查询..。
SELECT employees.empid, Max(employees.firstname) AS FirstName
FROM certified
INNER JOIN employees ON employees.empid = certified.empid
WHERE certified.empid NOT IN (SELECT certified.empid
FROM certified
INNER JOIN aircrafts ON aircrafts.aid = certified.aid
WHERE aircrafts.NAME LIKE 'BOEING%')
GROUP BY employees.empid 演示:http://www.sqlfiddle.com/#!18/8f26d/27/0
结果
+-------+-----------+
| EMPID | FirstName |
+-------+-----------+
| 3 | TOM |
| 5 | JACK |
| 8 | MATT |
+-------+-----------+发布于 2018-04-28 16:51:42
我认为你的质疑是给任何一名在非波音飞机上获得认证的员工--一组微妙的不同的人。
关于你的问题,我会选择not exists
select e.*
from employees e
where not exists (select 1
from certified c join
aircrafts a
on c.aid = a.aid
where e.empid = c.empid and a.name like '%BOEING%'
);另一种方法--如果您只想要员工id --使用聚合和having。
select e.empid, e.firstname
from employees e join
certified c
on e.empid = c.empid join
aircrafts a
on c.aid = a.aid
group by e.empid, e.firstname
having sum(case when a.name like '%BOEING%' then 1 else 0 end) = 0;我碰巧喜欢这种方法,因为它很容易推广到其他情况--比如飞机,波音,而不是空客,或者Learjet和Cessna。
发布于 2018-04-28 16:53:00
您不应在波音公司与飞机联合认证的emp中使用。
SELECT DISTINCT FIRSTNAME
FROM EMPLOYEES
WHERE EMPID NOT IN (SELECT EMPID
FROM CERTIFIED c
INNER JOIN AIRCRAFTS a ON on a.AID = c.AID
WHERE a.NAME LIKE 'BOEING%')https://stackoverflow.com/questions/50078862
复制相似问题