【问题标题】:Create a stored procedure that returns the manager of an employee创建一个返回员工经理的存储过程
【发布时间】:2016-11-28 01:17:39
【问题描述】:

我已执行以下操作来创建一个存储过程,该过程返回 EMPLOYEE 表中员工的经理:

[另外:REPORTSTO 是一个 NUMBER 值,包含员工经理的 ID]

create or replace PROCEDURE MANAGER_OF_EMPLOYEE 
(
  THE_EMPLOYEEID IN NUMBER
)
AS 
  TEMP VARCHAR2(20);
  TEMP2 VARCHAR2(20);
  TEMP3 VARCHAR2(20);
  TEMP4 VARCHAR2(20);
BEGIN
  SELECT MGR.FIRSTNAME, MGR.LASTNAME, EMP.FIRSTNAME, EMP.LASTNAME INTO TEMP, TEMP2, TEMP3, TEMP4
  FROM EMPLOYEE EMP
  LEFT OUTER JOIN EMPLOYEE MGR 
  ON EMP.EMPLOYEEID = MGR.REPORTSTO
  WHERE EMP.EMPLOYEEID = THE_EMPLOYEEID AND EMP.REPORTSTO = MGR.EMPLOYEEID;
  DBMS_OUTPUT.PUT_LINE(TEMP || ' ' || TEMP2 || ' IS THE MANAGER OF ' || TEMP3 || ' ' || TEMP4);
END MANAGER_OF_EMPLOYEE;

无论我将什么作为参数,我总是得到“Andrew Adams 是 Andrew Adams 的经理”。 Andrew Adams 是 EMPLOYEE 表中的第一行,并且是最高经理,所以从技术上讲,他是他自己的经理。但是为什么不管我输入什么,我都会得到相同的输出呢?

【问题讨论】:

  • 我认为你的 ON 条件是错误的。在 Emp.Employee=Mgr.ReportsTo 和后来的 WHERE 你有 Emp.ReportsTo=Mgr.EmployeeID。

标签: sql oracle stored-procedures plsql


【解决方案1】:

你的加入倒退了。这个:

LEFT OUTER JOIN EMPLOYEE MGR 
ON EMP.EMPLOYEEID = MGR.REPORTSTO

应该是这样的:

LEFT OUTER JOIN EMPLOYEE MGR 
ON MGR.EMPLOYEEID = EMP.REPORTSTO

一旦你更正了这个,除了EMPLOYEEID = THE_EMPLOYEEID,你的 WHERE 子句中就不需要任何东西了。

另外,我不会在此处使用左连接,除非您想要包含的 REPORTSTO 字段中有空值。只需使用内部连接。

【讨论】:

  • 知道了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-09
  • 2014-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多