【发布时间】:2016-08-12 20:27:21
【问题描述】:
我在 Oracle 中有一个 employee 表,它可以在表 future_jobs 中拥有 1 个或 2 个“未来”工作,这是某种业务规则,例如
| 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 子句类型解决方案。
【问题讨论】:
标签: sql oracle correlated-subquery case-when