Вернуть всех пользователей, даже тех, кто не соответствует моим критериям - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь вернуть полный список людей, но отображаю только данные в столбце «Тип документа», где тип документа «Отчет о проверке безопасности»

Я довольно новичок в SQL и пытаюсьразберись с этим. Цель состоит в том, чтобы руководство могло легко увидеть, кто имеет этот тип документа, а кто нет.

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
     , per_person_names_f                                       ppnf
     , hr_document_types_vl                                     dor_type
     , hr_documents_of_record                                   dor
 WHERE SYSDATE BETWEEN papf.effective_start_date AND papf.effective_end_date
   AND papf.person_id                      = ppnf.person_id 
   AND SYSDATE BETWEEN ppnf.effective_start_date AND ppnf.effective_end_date
   AND ppnf.name_type                      = 'GLOBAL'
   AND papf.person_id                      = dor.person_id (+)
   AND dor_type.document_type_id           = dor.document_type_id
   AND dor_type.document_type = 'Security Clearance Report'
ORDER BY e_name DESC

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

Как уже отмечалось в другом месте, такого рода вещи гораздо проще сделать, если вы используете соединения в стиле ANSI.

Несмотря на это, это немного сложно, потому что вы хотите LEFT JOIN свой списокчеловек в INNER JOIN между HR_DOCUMENTS_OF_RECORD и HR_DOCUMENT_TYPES_VL. То есть для каждого человека вам нужны документы записи типа «Отчет о проверке безопасности», если таковые имеются.

Вот как вы это делаете:

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;

Обратите внимание наINNER JOIN между DOR и DOR_TYPE заключено в круглые скобки, а условие LEFT JOIN равно после круглых скобок.

Если вы просто наивно LEFT JOIN, у всех и всех людей есть документызаписи, кроме отчетов о проверке безопасности, вы получите слишком много строк.

0 голосов
/ 28 октября 2019

Я пытаюсь вернуть полный список людей,

Чтобы получить полный список людей, я бы снял требование AND dor_type.document_type = 'Security Clearance Report'

Цель состоит в том, чтобы руководство могло легко увидеть, кто получил этот тип документа, а кто нет.

По своему выбору вы можете сделать следующее:

, DECODE(dor_type.document_type, 'Security Clearance Report', dor_type.document_type ,null)

Для любой строки, где тип_документа - тот, который вам нужен, он покажет его. Для остальных это просто покажет ноль.

SELECT papf.person_id
 , (ppnf.first_name||' '||ppnf.last_name)                                    e_name
 , dor.document_name
 , DECODE(dor_type.document_type, 'Security Clearance Report', dor_type.document_type ,null)
 , TO_CHAR(dor.creation_date, 'DD/MM/YYYY')                                  dor_issue_date
FROM per_all_people_f                                         papf
 , per_person_names_f                                       ppnf
 , hr_document_types_vl                                     dor_type
 , hr_documents_of_record                                   dor
WHERE SYSDATE BETWEEN papf.effective_start_date AND papf.effective_end_date
AND papf.person_id                      = ppnf.person_id 
AND SYSDATE BETWEEN ppnf.effective_start_date AND ppnf.effective_end_date
AND ppnf.name_type                      = 'GLOBAL'
AND papf.person_id                      = dor.person_id (+)
AND dor_type.document_type_id           = dor.document_type_id
ORDER BY e_name DESC
0 голосов
/ 28 октября 2019

Вы, вероятно, хотите левое соединение

 SELECT *
 FROM per_all_people_f papf
 JOIN  hr_documents_of_record  dor
   ON  papf.person_id =  dor.person_id
 LEFT 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...