请帮助我摆脱这种情况
我必须创建一个函数来检索给定员工的经理名称。 (我试图加入emp表来做到这一点,但不确定。)另外我需要写 一个SQL select语句,它使用该函数生成员工编号和名称列表以及他们的经理名称
谢谢
答案 0 :(得分:5)
正如您所指出的,解决方案是将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语法更新了一些查询
答案 1 :(得分:2)
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表的JOIN连接到它自己。