sql - SQL:选择不包含特定值的组
问题描述
我使用 Microsoft SQL Server Management Studio 2014,我有这 3 个表:
雇员
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 架飞机。CERTIFIED 表确定了哪些员工有权驾驶哪些飞机。不过,并非所有员工都是飞行员。我需要以某种方式选择所有未获得使用波音认证的飞行员。我尝试但没有奏效的内容如下:
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
这是错误的,因为根据 CERTIFIED 表,ADAM 和 DWAYNE 被授权驾驶至少一架波音。
任何帮助将不胜感激,在此先感谢!
解决方案
试试这个查询...
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 |
+-------+-----------+
推荐阅读
- php - Lumen - 如何创建一个可以由 app('request') 从不同文件访问的请求对象?
- bash - 逐列解析CSV文件时比较数值的问题
- r - 使用 read_lines 阅读 pdf 的多页
- excel - 如何允许对受保护的单元格进行格式化和调整大小 - VBA
- android - 是否可以在设备之间同步 HLS 直播?
- recursion - Erlang 打印 N 次
- php - 内部服务器错误 500 Laravel 5.4 AJAX
- typescript - 接口中的 {} 类型是什么?
- scala - 尝试在火花中以 avro 格式保存文件时出现 ClassCastException
- java - 如何关闭 Tomcat 套接字以停止侦听新的 HTTP 请求?