Oracle
 sql >> Base de données >  >> RDS >> Oracle

Renvoyer tous les utilisateurs, même ceux qui ne correspondent pas à mes critères

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.