在我们的web应用,员工可以在同一时间执行一个或更多的就业机会,所以数据库的结构是这样的:如何选择除匹配连接的记录以外的记录?
http://rextester.com/VTFND62465
表tma_employee
:
emp_id | emp_name
-------|---------
1 | BOB
2 | MAX
3 | SALLY
表tma_job
:
job_id | job_name
-------|---------
1 | DEV
2 | SALES
3 | MGMT
员工与工作之间的关系表tma_employee_job
:
emp_id | job_id
-------|-------
1 | 1
1 | 2
2 | 2
2 | 3
3 | 3
3 | 1
鉴于这种结构,很容易选择哪个执行一个或多个特定作业的所有员工:
SELECT DISTINCT E.*
FROM tma_employee E
JOIN tma_employee_job EJ USING (emp_id)
JOIN tma_job J USING (job_id)
WHERE J.job_name = 'DEV';
但是,我怎么可以选择做不执行所有员工工作?
我试图反转这样的条件:
SELECT DISTINCT E.*
FROM tma_employee E
JOIN tma_employee_job EJ USING (emp_id)
JOIN tma_job J USING (job_id)
WHERE J.job_name != 'DEV';
然而,这并不工作,因为,例如,BOB也对销售工作,这是从DEV不同,所以员工BOB从发现以上查询。
我还发现,这个工程:
SELECT DISTINCT E.*
FROM tma_employee E
WHERE E.emp_id NOT IN (
SELECT EJ.emp_id
FROM tma_employee_job EJ
JOIN tma_job J USING (job_id)
WHERE J.job_name = 'DEV'
);
但是,它要求我使用子查询,这是我想避免的,因为主查询是由基于该功能内置它接收的参数从SELECT E.* FROM tma_employee E
开始,然后添加所有的JOINS和子句。
是否可以获得使用子查询的查询的同样结果,同时坚持简单的JOINS?
我认为你钉了它! –
这似乎工作正常,很容易与查询生成器功能管理...我会尽快尝试。 –