mysql - How to select record except those that match the join? -
in our webapps, employee can perform 1 or more jobs @ same time, database structured this:
http://rextester.com/vtfnd62465
table tma_employee
:
emp_id | emp_name -------|--------- 1 | bob 2 | max 3 | sally
table tma_job
:
job_id | job_name -------|--------- 1 | dev 2 | sales 3 | mgmt
relation table between employees , jobs tma_employee_job
:
emp_id | job_id -------|------- 1 | 1 1 | 2 2 | 2 2 | 3 3 | 3 3 | 1
given structure, easy select employees perform 1 or more specific jobs:
select distinct e.* tma_employee e join tma_employee_job ej using (emp_id) join tma_job j using (job_id) j.job_name = 'dev';
however, how can select employees not perform job?
i tried inverting condition this:
select distinct e.* tma_employee e join tma_employee_job ej using (emp_id) join tma_job j using (job_id) j.job_name != 'dev';
however not work because, example, bob on sales job, different dev, employee bob found above query.
i have found works:
select distinct e.* tma_employee e e.emp_id not in ( select ej.emp_id tma_employee_job ej join tma_job j using (job_id) j.job_name = 'dev' );
however, requires me use subquery, avoid, because main query built function which, based on parameters receives, starts select e.* tma_employee e
, adds various joins , clauses.
is possible obtain same result of query uses sub-query, while sticking simple joins?
sql demo without subquery:
select e.emp_id, e.emp_name tma_employee e left join tma_employee_job ej using (emp_id) left join tma_job j on j.job_id = ej.job_id group e.emp_id, e.emp_name having count(case when job_name = 'dev' 1 end) = 0;
Comments
Post a Comment