/*
select first_name, (DENSE_RANK() over (order by first_name)) as f_rank
from employees
*/
select first_name
from (
select *, (DENSE_RANK() over (order by first_name)) as f_rank
from employees
) as fn_rank
where f_rank %2 = 1
order by emp_no;
这一道题我感觉是一个大坑。
题目中明确指出输出的结果不用排序,但是,如果你真不排序,真有可能出错。
具体讲一讲原因。
很多人可能会困惑,有时候感觉自己做对了,但是,无论自己是否按照first_name
排序,都是错误的。
这是因为,题目中的不需要排序,其实本身就是一种排序。
比如说,下面的代码
select first_name
from (
select first_name , (DENSE_RANK() over (order by first_name)) as f_rank
from employees
) as fn_rank
where f_rank %2 = 1
order by first_name;
明明输出结果包含的内容是一致的,但是,无论你怎么排序,系统都会报错。
内查询结果中,只包含first_name
和rank
的时候,不设置排序规则时会自动按照在内查询形成的临时表中的排序结果输出,但内查询的结果是按照first_name升序排序的 (DENSE_RANK() over (order by first_name))
,所以此时,无论你如何排序,本身都是在first_name排序的基础上的排序。
但是,题目中的不需要设置排序规则的情况,是没有进行内查询的时候,自动按照表格主键的排序的。
因此,最终推测出来,实际上的不需排序,讲的是,按照employees
中的主键,进行的升序排序。