Oracle
 sql >> Database >  >> RDS >> Oracle

Restituisci tutti gli utenti, anche quelli che non soddisfano i miei criteri

Come è stato notato altrove, questo genere di operazioni è molto più semplice se si utilizzano i join in stile ANSI.

Anche così, è un po' complicato perché vuoi LEFT JOIN il tuo elenco di persone a un INNER JOIN tra HR_DOCUMENTS_OF_RECORD e HR_DOCUMENT_TYPES_VL . Cioè, per ogni persona, vuoi i documenti di registrazione che sono di tipo "Security Clearance Report", se presenti.

Ecco come farlo:

SELECT papf.person_id
     , (ppnf.first_name||' '||ppnf.last_name)                                    e_name
     , dor.document_name
     , dor_type.document_type
     , TO_CHAR(dor.creation_date, 'DD/MM/YYYY')                                  dor_issue_date
FROM per_all_people_f  papf
INNER JOIN per_person_names_f ppnf ON ppnf.person_id = papf.person_id
           AND ppnf.name_type                      = 'GLOBAL'
           AND SYSDATE BETWEEN ppnf.effective_start_date AND NVL(ppnf.effective_end_date,SYSDATE)
LEFT JOIN ( hr_documents_of_record dor 
INNER JOIN hr_document_types_vl dor_type ON dor_type.document_type_id = dor.document_type_id
           AND dor_type.document_type = 'Security Clearance Report'  ) ON dor.person_id = papf.person_id
WHERE SYSDATE BETWEEN papf.effective_start_date AND NVL(papf.effective_end_date,SYSDATE)
ORDER BY e_name DESC;

Nota il INNER JOIN tra DOR e DOR_TYPE è tra parentesi e il LEFT JOIN condizione è dopo le parentesi.

Se ingenuamente LEFT JOIN tutto e tutte le persone hanno documenti di registrazione oltre ai rapporti di autorizzazione di sicurezza, otterrai troppe righe.