在函数 Oracle PLSQL 中带最高薪水员工 id 的查询?

Posted

技术标签:

【中文标题】在函数 Oracle PLSQL 中带最高薪水员工 id 的查询?【英文标题】:Query that brings the id of the employee with the highest salary in a function Oracle PLSQL? 【发布时间】:2020-02-21 12:45:10 【问题描述】:

我有以下问题: 我需要创建一个函数 PLSQL,它将职位作为参数并返回员工的最高薪水 ID。如果您有多个,请退回最近雇用日期的那个。

EMP (table)
  empno (id)
  ename (employee name)
  job (occupation)
  mgr (boss id)
  hiredate (hiring date)
  sal (salary)
  comm (commission)
  depto (Department)

由于我是 SQL 新手,希望您能帮助解决这个问题。谢谢!

【问题讨论】:

样本数据和期望的结果将阐明您想要做什么。 最初将是工作参数的条目(例如:分析师),并且必须返回具有最高薪水的员工 ID。返回示例(empno:2455)。如果您有不止一名员工,请提供最近的招聘日期,例如:(3555 - 02/21/2020)。 如果你想学习一些东西,你应该尝试自己编写这个函数,而不仅仅是复制粘贴。或者至少搜索数百个类似的答案,例如:How to get the highest paid employee row。 【参考方案1】:

样本数据:

SQL>   SELECT empno, ename, job, sal, hiredate
  2      FROM emp
  3  ORDER BY job, sal DESC, hiredate DESC;

     EMPNO ENAME      JOB              SAL HIREDATE
---------- ---------- --------- ---------- --------
      7788 SCOTT      ANALYST         3000 09.12.82
      7902 FORD       ANALYST         3000 03.12.81
      7876 ADAMS      CLERK           1300 12.01.83  --> highest ranked CLERK
      7934 MILLER     CLERK           1300 23.01.82
      7900 JAMES      CLERK            950 03.12.81
      7369 SMITH      CLERK            920 17.12.80
      7566 JONES      MANAGER         2975 02.04.81
      7698 BLAKE      MANAGER         2850 01.05.81
      7782 CLARK      MANAGER         2450 09.06.81
      7839 KING       PRESIDENT      10000 17.11.81
      7499 ALLEN      SALESMAN        1600 20.02.81  --> highest ranked SALESMAN
      7844 TURNER     SALESMAN        1500 08.09.81
      7654 MARTIN     SALESMAN        1250 28.09.81
      7521 WARD       SALESMAN        1250 22.02.81

14 rows selected.

功能:使用row_number 分析函数根据员工的薪水和雇用日期排序。代码包含一些多余的数据,但如果您想单独使用它的select 来查看发生了什么,它会有所帮助。

SQL> CREATE OR REPLACE FUNCTION f_sal (par_job IN emp.job%TYPE)
  2     RETURN emp.empno%TYPE
  3  IS
  4     retval  emp.empno%TYPE;
  5  BEGIN
  6     SELECT empno
  7       INTO retval
  8       FROM (SELECT empno,
  9                    ename,
 10                    job,
 11                    sal,
 12                    hiredate,
 13                    ROW_NUMBER ()
 14                       OVER (PARTITION BY job ORDER BY sal DESC, hiredate DESC)
 15                       rn
 16               FROM emp
 17              WHERE job = par_job)
 18      WHERE rn = 1;
 19
 20     RETURN retval;
 21  EXCEPTION
 22     WHEN NO_DATA_FOUND
 23     THEN
 24        RETURN NULL;
 25  END;
 26  /

Function created.

SQL>

测试:

SQL> SELECT f_sal ('CLERK') result FROM DUAL;

    RESULT
----------
      7876

SQL> SELECT f_sal ('SALESMAN') result FROM DUAL;

    RESULT
----------
      7499

SQL> SELECT f_sal ('hotfix') result FROM DUAL;

    RESULT
----------


SQL>

【讨论】:

no_data_found 是怎么回事? :) 数据总会被找到,@hotfix。至少,在我的宇宙中(由这个例子表示):) 我的意思是如果你调用一个没有工作的函数 我知道你的意思,@hotfix;只是在开玩笑。谢谢评论,我修改了功能代码。

以上是关于在函数 Oracle PLSQL 中带最高薪水员工 id 的查询?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle HR 模式。从员工中选择最高工资

Mysql 练习题10道(1-10题)

PLSQL 问题:使用带有过程块的随机值更新员工的薪水

9取得薪水最高的前五名员工bjpowernode34道SQL题

10取得薪水最高的第六到第十名员工bjpowernode34道SQL题

oracle---plsql---示例laobai