【问题标题】:What is the best way(in case of performance) to find out the user details with maximum salary?找出最高薪水的用户详细信息的最佳方法是什么(在绩效的情况下)?
【发布时间】:2022-01-18 09:12:09
【问题描述】:

我们还有一列薪水的用户详细信息,我们如何打印具有最高薪水的用户详细信息,我不想使用子查询,是的,子查询将如何降低性能。 我知道这个查询是错误的,但我想要这样的东西:

  select User_name, user_id 
  from dual where salary=Max(salary);

【问题讨论】:

  • 您是否尝试过使用子查询?性能数字是什么样的?你有多少记录?你用的是什么数据库?我非常怀疑无论数据有多大,在计算像 max 这样简单的东西而没有任何连接时都会存在性能问题。

标签: sql oracle plsql subquery query-optimization


【解决方案1】:

分析函数帮助。

使用 CTE(这是一种子查询;不要害怕它,它不会咬人也不会影响性能),查询可能看起来像这样(基于示例 Scott 的架构):

SQL> select ename, sal from emp order by sal desc;

ENAME             SAL
---------- ----------
KING             5000         --> this is the highest salary
FORD             3000         --> FORD and SCOTT share the 2nd place
SCOTT            3000
JONES            2975
BLAKE            2850
CLARK            2450
ALLEN            1600
TURNER           1500
MILLER           1300
WARD             1250         --> WARD and MARTIN are then 9th
MARTIN           1250
ADAMS            1100
JAMES             950
SMITH             800

14 rows selected.

然后查询

SQL> with temp as
  2    (select ename,
  3            dense_rank() over (order by sal desc) rnk
  4     from emp
  5    )
  6  select ename
  7  from temp
  8  where rnk = 1;

ENAME
----------
KING

SQL>

为什么是dense_rank?因为两名(或更多)员工可以拥有相同的薪水,所以他们“排名”相同。例如,如果你想知道谁的薪水排在第 9 位,你应该

SQL> l8
  8* where rnk = 1
SQL> c/1/9
  8* where rnk = 9
SQL> /

ENAME
----------
WARD
MARTIN

SQL>

您建议的查询(虽然错误,但是 - 我明白了)看起来像这样:

SQL> select ename
  2  from emp
  3  where sal = (select max(sal) from emp);

ENAME
----------
KING

SQL>

是的,它会影响性能,因为您从同一个 emp 表中获取数据两次:一次是为了找到最高薪水(在子查询中),然后是在 main 查询中找出它属于谁。

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2020-11-05
    • 1970-01-01
    • 2014-01-08
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多