Comme cela a été noté ailleurs ici, ce genre de chose est beaucoup plus simple à faire si vous utilisez des jointures de style ANSI.
Même ainsi, c'est un peu délicat car vous voulez LEFT JOIN
votre liste de personnes à un INNER JOIN
entre HR_DOCUMENTS_OF_RECORD
et HR_DOCUMENT_TYPES_VL
. C'est-à-dire que pour chaque personne, vous voulez les documents d'enregistrement de type "Rapport d'habilitation de sécurité", s'il en existe.
Voici comment procéder :
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;
Notez le INNER JOIN
entre DOR
et DOR_TYPE
est entre parenthèses et le LEFT JOIN
la condition est après les parenthèses.
Si vous venez naïvement LEFT JOIN
tout et n'importe qui ont des documents d'enregistrement en plus des rapports d'habilitation de sécurité, vous obtiendrez trop de lignes.