Oracle 有人能解释一下这个查询是如何工作的吗?

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

这是一个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 (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
,而不使用任何产品标记。