我试图返回人员的完整列表,但仅在文档类型为“安全清除报告”的“文档类型”列中显示数据
我对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
答案 0 :(得分:3)
正如此处其他地方所指出的那样,如果您使用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
,并且任何人除了安全检查报告之外,还有记录的文件,那么您将得到太多的行。
答案 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