Som har noterats på andra ställen här är den här typen av saker mycket enklare att göra om du använder ANSI-anslutningar.
Trots det är det lite knepigt eftersom du vill LEFT JOIN
din lista över personer till en INNER JOIN
mellan HR_DOCUMENTS_OF_RECORD
och HR_DOCUMENT_TYPES_VL
. Det vill säga, för varje person vill du ha de registrerade dokumenten av typen "Säkerhetsprövningsrapport", om det finns några.
Så här gör du det:
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;
Notera INNER JOIN
mellan DOR
och DOR_TYPE
står inom parentes och LEFT JOIN
skick är efter parenteserna.
Om du bara naivt LEFT JOIN
allt och alla personer har dokumenterade dokument förutom säkerhetsprövningsrapporter, du kommer att få för många rader.