返回所有用户,甚至那些不符合我条件的用户

时间:2019-10-28 16:13:18

标签: sql oracle

我试图返回人员的完整列表,但仅在文档类型为“安全清除报告”的“文档类型”列中显示数据

我对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 个答案:

答案 0 :(得分:3)

正如此处其他地方所指出的那样,如果您使用ANSI样式的联接,则这种事情要简单得多。

即使如此,它还是有些棘手,因为您想LEFT JOININNER JOINHR_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 JOINDOR之间的DOR_TYPE在括号中,而LEFT JOIN条件在括号后

如果您只是天真地LEFT JOIN,并且任何人除了安全检查报告之外,还有记录的文件,那么您将得到太多的行。

答案 1 :(得分:0)

您可能想要左加入

 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'

答案 2 :(得分:0)

  

我正在尝试返回完整的人员名单,

要获取人员的完整列表,我将删除要求 AND dor_type.document_type = 'Security Clearance Report'

  

目标是使管理人员可以轻松地查看谁拥有此文档类型,而谁却没有。

您可以选择执行以下操作:

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

对于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