首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:选择不包含特定值的组

SQL:选择不包含特定值的组
EN

Stack Overflow用户
提问于 2018-04-28 16:47:21
回答 3查看 1.2K关注 0票数 3

我使用2014,我有以下三个表:

员工

代码语言:javascript
复制
EMPID | FIRSTNAME
  1   | JOHNNY
  2   | DWAYNE
  3   | TOM
  4   | CHRISTIAN
  5   | JACK
  6   | BRAD
  7   | ADAM
  8   | MATT
  9   | WILL
  10  | JIM

飞机

代码语言:javascript
复制
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

经认证

代码语言:javascript
复制
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架飞机。认证表确定哪些雇员被授权驾驶哪架飞机。但并不是所有的员工都是飞行员。我需要的是选择所有的飞行员谁没有资格证明使用波音。我试过但没有成功的地方如下:

代码语言:javascript
复制
SELECT DISTINCT FIRSTNAME
FROM EMPLOYEES
WHERE EMPID IN (SELECT EMPID
                FROM CERTIFIED
                WHERE AID NOT IN (SELECT AID FROM AIRCRAFTS WHERE NAME LIKE 'BOEING%'))

给出了以下结果:

代码语言:javascript
复制
JACK
MATT
TOM
ADAM
DWAYNE

这是错误的,因为根据认证表,亚当和德维恩被授权驾驶至少一架波音。

任何帮助都将不胜感激,谢谢提前!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-28 17:32:19

试试这个查询..。

代码语言:javascript
复制
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

结果

代码语言:javascript
复制
+-------+-----------+
| EMPID | FirstName |
+-------+-----------+
|     3 | TOM       |
|     5 | JACK      |
|     8 | MATT      |
+-------+-----------+
票数 4
EN

Stack Overflow用户

发布于 2018-04-28 16:51:42

我认为你的质疑是给任何一名在非波音飞机上获得认证的员工--一组微妙的不同的人。

关于你的问题,我会选择not exists

代码语言:javascript
复制
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

代码语言:javascript
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2018-04-28 16:53:00

您不应在波音公司与飞机联合认证的emp中使用。

代码语言:javascript
复制
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%')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50078862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档