2016-11-28 60 views
0

我曾經做過的經理下面創建一個存儲過程返回僱員的經理在EMPLOYEE表:創建一個存儲過程返回僱員

[此外:上級是一個數值,幷包含該員工的經理]

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; 

我總是得到「安德魯·亞當斯是安德魯·亞當斯的經理」不管是什麼,我把作爲參數的ID。安德魯亞當斯是EMPLOYEE表中的第一排,並且是最高管理者,所以在技術上他是他自己的經理。但是,無論我輸入什麼輸入,爲什麼我會得到相同的輸出?

+1

我認爲你的ON條件是錯誤的。在Emp.Employee = Mgr.ReportsTo和稍後在WHERE你有Emp.ReportsTo = Mgr.EmployeeID。 – Sparky

回答

0

您已將您的連接向後。這:

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

應該是這樣的:

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

一旦你解決這個問題,你就不是你的WHERE子句中需要什麼,除了EMPLOYEEID = THE_EMPLOYEEID

此外,我不會在這裏使用左連接,除非您在要包含的REPORTSTO字段中有空值。只需使用內部連接。

+0

明白了!謝謝! –