我在Oracle中有一個employee
表,它可以在表future_jobs
中有一個或兩個「將來」作業,這是某種商業規則(例如,使相關的子查詢超出CASE WHEN語句
| employee_id | job_id | job_start_date | job_end_date |
|-------------|--------|----------------|--------------|
| 1 | 127589 | 12-SEP-2016 | 25-DEC-2016 |
| 1 | 834780 | 26-DEC-2016 | 08-AUG-2017 |
| 2 | 800253 | 20-OCT-2016 | 13-APR-2017 |
我必須通過調用具有特定參數的存儲過程來獲得每個未來作業的描述,例如, F1
和F2
,基於job_start_date
的降序排列。在上面的例子中,對於employee_id = 1
,當針對job_id = 127589
行執行以下查詢時,因爲job_start_date = 12-SEP-2016
是employee_id = 1
的兩行中最早的日期,應調用get_description(emp.employee_id, 'F1')
,get_description(emp.employee_id, 'F2')
爲job_id = 834780
。
和employee_id = 2
,由於只有一個未來作業,因此應使用以下查詢調用get_description(emp.employee_id, 'F1')
。目前,我可以通過以下查詢來獲取相關信息:
select
emp.employee_id,
case
when fj.job_start_date = (select max(job_start_date)
from future_jobs
where employee_id = fj.employee_id
group by employee_id
having count(employee_id) > 1)
then get_description(emp.employee_id, 'F2')
else get_description(emp.employee_id, 'F1')
end job_description,
fj.job_start_date
jd.some_additional_columns
from employees emp
join future_jobs fj
on emp.employee_id = fj.employee_id
join job_details jd
on jd.job_id = fj.job_id
and jd.job_start_date = fj.job_start_date
and jd.job_end_date = fj.job_end_date
。
| employee_id | job_description | job_start_date | jd.columns |
|-------------|----------------------|----------------|--------------|
| 1 | 1st future job desc | 12-SEP-2016 | .... |
| 1 | 2nd future job desc | 26-DEC-2016 | .... |
| 2 | 1st future job desc | 20-OCT-2016 | .... |
但是,我想知道是否有另一種方法來取出CASE WHEN語句的相關子查詢嗎?有沒有辦法做到這一點,而不使用相關的子查詢?我需要在一個聲明中完成此操作,而不是使用WITH
子句類型的解決方案。
謝謝。這就是我一直在尋找的。我更新了描述來解釋查詢應該返回的內容。您如何比較此解決方案與問題解決方案的性能?在什麼條件下,分區和分析功能表現更好? – Malvon