我指的是以下查询以查找员工的第 N 个最高薪水。
select sal from emp t where &n = (select count(sal) from (select distinct sal
from emp) where t.sal<=sal);
一位先生说这个查询有效。有人可以解释一下如何将 COUNT(实际上是 1 到 X 之间的值,其中 X 是不同的总薪水)等同于 &n 产生这个结果吗?
我想了解数据库如何在内部处理此查询并生成结果?
谢谢。
最佳答案
首先,查询将返回 nth
最低 工资值。返回 nth
你必须改变的最高工资值t.sal <= sal
至 t.sal >= sal
.
接下来,此查询的工作方式是首先找到不同的薪水值列表作为一个派生表,然后确定薪水低于此列表中每个员工的员工数量。 t.sal <= sal
正在获取派生表(大多数数据库需要有别名)并将每个值与外部 emp
进行比较 table 。需要注意的是,如果出现平局,这将返回多行。
要手动跟踪输出,我们需要一些输入:
Alice | 200
Bob | 100
Charlie | 200
Danielle | 150
Select Distinct sal
From emp
给我们
200
100
150
现在我们分析外表中的每一行
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
因此,对于每个薪水值,我们得到以下计数(并按计数重新排序):
Bob 1
Danielle 2
Charlie 3
Alice 3
我认为您忽略的最重要的方面是外部 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
)
关于SQL 查询查找第 N 个最高薪水,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10492357/