这个问题有点糟糕。
根据列值将结果排序为 asc 或 desc。
一列有许多值(因为有多行)。
现在,order by
子句使用表达式并在其上排序行。该表达式应该是morphotropic(;))
因此,假设标准 oracle 的员工模式,经理是:
select *
from emp e
where exists (select emp_id from emp where e.id=emp.mgr_id)
解决方法查询可能是:
Select e.id, e.name, e.birth_date,
case
when (select count(*)
from emp e
where exists (select emp_id from emp where e.id=emp.mgr_id)
) --existence of manager
> 0 then birth_date - to_date('1-Jan-1000','dd-mon-yyyy')
else to_date('1-Jan-1000','dd-mon-yyyy') - birth_date
end as tricky_expression
from emp A
order by 4;
该表达式是case
; 使用常量(决定有经理的子查询)将值从正数更改为负数,即更改订单方向。
更新:评论中的详细信息:
select id, name, birth_date emp_type
from (
Select id, name, birth_date, emp_type,
case when cnt_mgr > 0 then birth_date - to_date('1-Jan-1000','dd-mon-yyyy')
else to_date('1-Jan-1000','dd-mon-yyyy') - birth_date
end as tricky_expression
from(
Select e.id, e.name, e.birth_date, emp_type,
count(case when emp_type='M' then 1 else 0 end) over() as mgr_count
from emp A
where your_conditions
)
order by tricky_expression
)
where rownum=1;