sql >> Database >  >> RDS >> Oracle

Alle gebruikers retourneren, zelfs degenen die niet aan mijn criteria voldoen

Zoals elders hier is opgemerkt, is dit soort dingen veel eenvoudiger te doen als u joins in ANSI-stijl gebruikt.

Toch is het een beetje lastig, want je wilt LEFT JOIN uw lijst met mensen naar een INNER JOIN tussen HR_DOCUMENTS_OF_RECORD en HR_DOCUMENT_TYPES_VL . Dat wil zeggen, voor elke persoon wilt u de geregistreerde documenten van het type "Security Clearance Report", indien aanwezig.

Zo doe je dat:

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;

Let op de INNER JOIN tussen DOR en DOR_TYPE staat tussen haakjes en de LEFT JOIN voorwaarde is na de haakjes.

Als je gewoon naïef LEFT JOIN alles en alle mensen hebben documenten behalve veiligheidsmachtigingen, je krijgt te veel rijen.



  1. MySql - Is er ergens een wachtrij voor query's?

  2. Hoe een lijst met kolommen met unieke beperkingen in SQL Server-database te krijgen - SQL Server / TSQL-zelfstudie, deel 98

  3. Yii2 QueryBuilder-update met Join

  4. MySQL ISNULL() uitgelegd