我指的是以下查询来查找员工的第N个最高薪水.
select sal from emp t where &n = (select count(sal) from (select distinct sal
from emp) where t.sal<=sal);
Run Code Online (Sandbox Code Playgroud)
一位先生说这个查询有效.有人可以解释如何将COUNT(实际上是1到X之间的值,其中X是完全不同的工资)等同于产生这个结果?
我试图了解数据库如何在内部处理此查询并生成结果?
谢谢.
首先,查询将返回nth 最低工资值.要返回nth最高工资值,您必须更改t.sal <= sal为t.sal >= sal.
接下来,此查询首先查找薪水值的不同列表作为一个派生表,然后确定薪水少于此列表中每个薪水的员工数.t.sal <= sal正在获取派生表(大多数数据库需要具有别名)并将每个值与外表进行比较emp.应该注意,在平局的情况下,这将返回多行.
要手动跟踪输出,我们需要一些输入:
Alice | 200
Bob | 100
Charlie | 200
Danielle | 150
Select Distinct sal
From emp
Run Code Online (Sandbox Code Playgroud)
给我们
200
100
150
Run Code Online (Sandbox Code Playgroud)
现在我们分析外表中的每一行
Alice - There are 3 distinct salary values less than or equal to 200
Bob - 1 rows <= 100
Charlie - 3 rows <= 200
Danielle - 2 row <= 150
Run Code Online (Sandbox Code Playgroud)
因此,对于每个工资值,我们得到以下计数(并按计数重新排序):
Bob 1
Danielle 2
Charlie 3
Alice 3
Run Code Online (Sandbox Code Playgroud)
我想你俯瞰最重要的方面是,外部emp表相关的内数计算(这就是为什么它被称为相关子查询).即,对于外部emp表中的每一行,计算该行的工资的新计数t.sal <= sal.同样,大多数数据库系统都要求最内部的查询具有这样的别名(注意As Z别名):
Select sal
From emp As t
Where &n = (
Select Count(Z.sal)
From (
Select Distinct sal
From emp
) As Z
Where t.sal <= Z.sal
)
Run Code Online (Sandbox Code Playgroud)