Oracle 有人能解释一下这个查询是如何工作的吗?
这是一个SQL查询,用于查找员工的第n个最高工资:Oracle 有人能解释一下这个查询是如何工作的吗?,oracle,Oracle,这是一个SQL查询,用于查找员工的第n个最高工资: SELECT * FROM emp t WHERE 1 = (SELECT COUNT(DISTINCT sal) FROM emp t2 WHERE t2.sal > t.sal) 我不知道它是如何返回结果的。如果在WHERE子句中输入1,它将返回第二高的工资,对于2,返回第三高的工资,依此类推 请解释我不确定的查询。让我先说一个更好的编写查询的方法是: select e.* from (s
SELECT *
FROM emp t
WHERE 1 = (SELECT COUNT(DISTINCT sal)
FROM emp t2
WHERE t2.sal > t.sal)
我不知道它是如何返回结果的。如果在WHERE
子句中输入1,它将返回第二高的工资,对于2,返回第三高的工资,依此类推
请解释我不确定的查询。让我先说一个更好的编写查询的方法是:
select e.*
from (select e.*, dense_rank() over (order by sal desc) as seqnum
from emp e
) e
where seqnum = 2;
你的问题是什么?循序渐进:
- 外部查询正在对
中的每一行进行比较emp
- 比较统计大于行中薪资的不同薪资的数量
- 如果恰好有一个较大的薪资,则保留该行
换句话说,这将保留所有具有第二大薪资的行
dense_rank()
是一种更明智的查询编写方法(它也有更好的性能)。让我首先说一个更好的查询编写方法是:
select e.*
from (select e.*, dense_rank() over (order by sal desc) as seqnum
from emp e
) e
where seqnum = 2;
你的问题是什么?循序渐进:
- 外部查询正在对
中的每一行进行比较emp
- 比较统计大于行中薪资的不同薪资的数量
- 如果恰好有一个较大的薪资,则保留该行
换句话说,这将保留所有具有第二大薪资的行
dense_rank()
是编写查询的一种更明智的方法(而且它的性能也更好)。您使用的是哪种RDBMS?您已经标记了Oracle和Microsoft SQLServer@Diado,虽然标记多个RBM是一个错误的习惯,但在这种情况下,它真的很重要吗?显然不重要。@Diado我只是想了解在每个RDBMS中都相同的逻辑,所以我认为这不会是一个问题。此查询将适用于所有RDBMS。@PrakharDubey在这种情况下,您真的应该只使用标记sql
,而不使用任何产品标记。您正在使用哪些RDBMS?您已经标记了Oracle和Microsoft SQLServer@Diado,虽然标记多个RBM是一个错误的习惯,但在这种情况下,它真的很重要吗?显然不重要。@Diado我只是想了解在每个RDBMS中都相同的逻辑,所以我认为这不会是一个问题。此查询将适用于所有RDBMS。@PrakharDubey在这种情况下,您真的应该只使用标记sql
,而不使用任何产品标记。