sql >> Databáze >  >> RDS >> Oracle

Vrátit všechny uživatele, dokonce i ty, kteří nesplňují moje kritéria

Jak zde bylo uvedeno jinde, tento druh věcí je mnohem jednodušší, pokud používáte spojení ve stylu ANSI.

I tak je to trochu složitější, protože se chcete LEFT JOIN váš seznam lidí do INNER JOIN mezi HR_DOCUMENTS_OF_RECORD a HR_DOCUMENT_TYPES_VL . To znamená, že pro každou osobu chcete mít dokumenty typu "Security Clearance Report", pokud nějaké existují.

Zde je návod, jak to udělat:

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;

Všimněte si INNER JOIN mezi DOR a DOR_TYPE je v závorkách a LEFT JOIN stav je po závorky.

Pokud jste jen naivně LEFT JOIN všechno a všichni lidé mají kromě zpráv o bezpečnostních prověrkách dokumenty o záznamech, dostanete příliš mnoho řádků.



  1. vložte více řádků pomocí jedné hodnoty forigenk ve formuláři

  2. Získání kódování databáze Postgres

  3. Jak úplně odstranit MySQL pomocí konfiguračních a knihovních souborů?

  4. Jedinečný sloupec MySQL SELECT, kde další sloupec je max