sql >> Databasteknik >  >> RDS >> Oracle

Returnera alla användare, även de som inte uppfyller mina kriterier

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.



  1. mysql sammanfoga två tabeller med kommaseparerade ID

  2. vad är poängen med att serialisera arrayer för att lagra dem i db?

  3. Prestandaskillnad mellan tabellsamlingar i MySQL

  4. Välj efter månad i ett fält