
请帮我摆脱这种情况
我必须创建一个函数来检索给定员工的经理姓名。(我尝试将emp表连接到自身以完成此操作,但不确定。)此外,我还需要编写一条SQL select语句,该语句使用该函数来生成员工编号和姓名及其经理姓名的列表
谢谢
发布于 2011-08-25 18:33:25
对于从EMP表的查询中调用的函数,Filip's function不是最佳解决方案。该表具有MGR属性,这是应该传递给函数的属性。
CREATE FUNCTION fn_get_manager(p_mgr IN emp.mgr%type)
RETURN VARCHAR2
IS
manager emp.ename%type;
BEGIN
SELECT ename
INTO manager
FROM emp e
WHERE e.empno = p_mgr;
RETURN(manager);
END;在不对EMP表引入另一次不必要的读取的情况下,这些东西的性能已经很差了。
但在Filip时代,这应该在SQL中正确地完成,并将EMP表连接到自身。
发布于 2011-08-25 17:50:13
正如您所指出的,解决方案是将emp表与自身连接起来。
CREATE FUNCTION fn_get_manager(p_empno IN NUMBER)
RETURN VARCHAR2
IS manager VARCHAR2;
BEGIN
SELECT mgr.name
INTO manager
FROM emp e, emp mgr
WHERE e.mgr = mgr.empno
AND e.empno = p_empno;
RETURN(manager);
END;您可以将此查询包装在用户定义的函数中,其中@employee变量将成为参数。
要返回雇员列表,可以在select语句中调用函数
SELECT e.empno, e.name, fn_get_manager(e.empno)
FROM emp e尽管这种构造可以工作,但对于如此简单的请求来说,这是一种可怕的方式。该函数将对emp表中的每条记录执行,与简单的join语句相比,结果将非常慢。
SELECT e.empno, e.name, mgr.name
FROM emp e,emp mgr
WHERE e.mgr = mgr.empno (+)我在这里使用了左连接来处理“大老板”的边缘情况,因为“大老板”本身没有经理。
编辑:更新了一些oracle语法的查询
https://stackoverflow.com/questions/7188096
复制相似问题