Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Retornar todos os usuários, mesmo aqueles que não se enquadram nos meus critérios


Como foi observado em outro lugar aqui, esse tipo de coisa é muito mais simples de fazer se você usar junções no estilo ANSI.

Mesmo assim, é um pouco complicado porque você quer LEFT JOIN sua lista de pessoas para um INNER JOIN entre HR_DOCUMENTS_OF_RECORD e HR_DOCUMENT_TYPES_VL . Ou seja, para cada pessoa, você deseja os documentos de registro que são do tipo "Relatório de Liberação de Segurança", se houver.

Aqui está como você faz isso:
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;

Observe o INNER JOIN entre DOR e DOR_TYPE está entre parênteses e o LEFT JOIN condição é depois os parênteses.

Se você ingenuamente LEFT JOIN tudo e todas as pessoas têm documentos de registro além de relatórios de autorização de segurança, você terá muitas filas.