sql >> Base de Datos >  >> RDS >> Oracle

Devolver todos los usuarios, incluso aquellos que no se ajustan a mis criterios

Como se ha señalado en otra parte aquí, este tipo de cosas es mucho más simple de hacer si usa uniones de estilo ANSI.

Aun así, es un poco complicado porque quieres LEFT JOIN su lista de personas a un INNER JOIN entre HR_DOCUMENTS_OF_RECORD y HR_DOCUMENT_TYPES_VL . Es decir, para cada persona, desea los documentos de registro que son del tipo "Informe de Autorización de Seguridad", si existen.

Así es como lo haces:

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;

Tenga en cuenta el INNER JOIN entre DOR y DOR_TYPE está entre paréntesis y LEFT JOIN la condición es después los paréntesis.

Si ingenuamente LEFT JOIN todo y cualquier persona tiene documentos de registro además de los informes de autorización de seguridad, obtendrá demasiadas filas.