i would be grateful for any help in solving the problem below. I’ve restated the problem following a request for some data
I have the following sql tables
qual = List of qualification codes (qualcode, description) e.g.
HSE-01 HSE INDUCTION HSE-02 SAFETY BRIEFING HSE-03 FIRST AID
labor = List of labor codes (laborcode, name)
10072 John Doe 10073 Jane Smith 10074 Mark Twain
craft = List of craft codes (craft, desc)
MECH Mechanic ELEC Electrician PLUM Plumber
laborcraft = the craft attached to each labor code (laborcode, craft)
10072 MECH 10073 ELEC 10074 PLUM
qualcraft = qualifications relevant to each craft (qualcode, craft)
HSE-01 MECH HSE-02 ELEC HSE-03 PLUM
laborqual = actual qualifications of each labor id (laborcode, qualcode)
10072 HSE-01 10073 HSE-01 10072 HSE-02 10074 HSE-02
Each Qualification code may be relevant for one or many crafts, Each labor code has a single craft
From the data in table 5 above you can see that qualification HSE-03 is relevant for the PLUM craft and HSE-02 is relevant for the ELEC craft
However from table 6 (actual qualifications) we can see that
- Mark Twain is a PLUM craft but does not possess the HSE-03 qualification
- Jane Smith is an ELEC but does not possess the HSE-02 qualification.
I need to identify all the qualifications that SHOULD be held by each labor code but ARE NOT. the results should look like
10073 HSE-02 10074 HSE-03
I don’t mind if labor codes have other qualifications that they don’t need to have for example
10072 HSE-02 10073 HSE-01 10074 HSE-02
I just need to know where we’re missing the relevant qualifications
Thanks for any help
Advertisement
Answer
You could join laborcraft
and qualcraft
, and use not exists
to flter on “missing” rows in laborqual
:
select lc.laborcode, qc.qualcode from laborcraft lc inner join qualcraft qc on qc.craft = lc.craft where not exists ( select 1 from laborqual lq where lq.laborcode = lc.laborcode and lq.qualcode = qc.qualcode )