Applications-Table --------------------- ID FIRST_NAME LAST_NAME APPLICATION_TYPE STATUS_TYPE 123 JOHN SMITH EDUCATION APPROVED 456 JANE DOE EDUCATION APPROVED 789 SARA JANE EDUCATION APPROVED 321 BOB KANE GENERAL APPROVED 879 OLIVER QUEEN GENERAL APPROVED Assignments-Table ID APPLICATION_ID INACTIVE 0001 456 0 0002 789 1
I am trying to write a sql statement that looks at tables similar to the example above. What I need for results is a record that exists in the applications table that has an application type of education and a status type of approved but does not have a record in the assignments table. However if a record exists in the assignments table then the Inactive column has to be 1. Below is the sql I’ve been working with
SELECT application.ID, application.FIRST_NAME, application.LAST_NAME, FROM applications application LEFT JOIN assignments assignment ON application.ID = assignment.APPLICATION_ID WHERE application.STATUS_TYPE = 'APPROVED' AND application.APPLICATION_TYPE = 'EDUCATION' AND assignment.APPLICATION_ID IS NULL OR assignment.INACTIVE != 0
I also tried the below sql but then I get John Smith, Jane Doe, and Sara Jane.
SELECT application.ID, application.FIRST_NAME, application.LAST_NAME, FROM applications application LEFT JOIN assignments assignment ON application.ID = assignment.APPLICATION_ID WHERE application.STATUS_TYPE = 'APPROVED' AND application.APPLICATION_TYPE = 'EDUCATION' AND (assignment.APPLICATION_ID IS NULL OR assignment.INACTIVE != 0)
The records I’d expect to get back would be John Smith and Sara Jane. Currently I am getting those 2 records and Jane Doe which I do not want in my results set.
Advertisement
Answer
I am thinking not exists
:
select a.* from applications a where a.STATUS_TYPE = 'APPROVED' and a.APPLICATION_TYPE = 'EDUCATION' and not exists (select 1 from assignments am where a.ID = am.APPLICATION_ID and am.inactive <> 1 );
If you want to express this using left join
, the logic is:
select a.* from applications a left join assignments am on a.ID = am.APPLICATION_ID and am.inactive <> 1 where a.STATUS_TYPE = 'APPROVED' and a.APPLICATION_TYPE = 'EDUCATION' and am.application_id is null;
Here is a db<>fiddle.