Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Alle Benutzer zurückgeben, auch diejenigen, die nicht meinen Kriterien entsprechen

Wie an anderer Stelle hier angemerkt wurde, ist so etwas viel einfacher, wenn Sie Joins im ANSI-Stil verwenden.

Trotzdem ist es ein wenig schwierig, weil Sie LEFT JOIN möchten Ihre Personenliste zu einem INNER JOIN zwischen HR_DOCUMENTS_OF_RECORD und HR_DOCUMENT_TYPES_VL . Das heißt, Sie möchten für jede Person die Aufzeichnungen vom Typ "Sicherheitsüberprüfungsbericht", sofern vorhanden.

So gehen Sie vor:

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;

Beachten Sie den INNER JOIN zwischen DOR und DOR_TYPE in Klammern steht und der LEFT JOIN Bedingung ist nach die Klammern.

Wenn Sie nur naiv LEFT JOIN alles und alle Personen außer Sicherheitsüberprüfungsberichten Dokumente haben, werden Sie zu viele Zeilen bekommen.