2013-12-16 82 views
0

我有兩張表 - 員工和經理。一位經理有很多員工。我想使用CONNECT BY和GROUP BY命令在父子關係中顯示它。不能同時使用CONNECT BY和GROUP BY

結構EMPLOYEE表:

CREATE TABLE employee (
    employee_id INTEGER, 
    manager_id INTEGER, 
    first_name VARCHAR2(10) NOT NULL, 
    last_name VARCHAR2(10) NOT NULL 
); 

的經理表結構:

CREATE TABLE manager(
    manager_id INTEGER NOT NULL, 
    manager_dept VARCHAR2(20) NOT NULL, 
    first_name VARCHAR2(30) NOT NULL, 
    last_name VARCHAR2(30) NOT NULL 
); 

我寫此查詢:

SELECT E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME, E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE 
FROM EMPLOYEE E 
LEFT OUTER JOIN MANAGER M 
ON E.MANAGER_ID=M.MANAGER_ID 
connect by NOCYCLE m.manager_id=prior e.employee_id 
GROUP BY manager_id; 

它給這個錯誤:

ORA-00918: column ambiguously defined 
00918. 00000 - "column ambiguously defined" 
Error at Line: 6 Column: 10 

這個小組by by clause有什麼問題?

+0

你不需要'在這種情況下CONNECT BY',只是'LEFT JOIN'就足夠了。也不需要使用「GROUP BY」,因爲您沒有計算任何聚合。我建議你閱讀那些主題的文檔,以便在你應該使用它時得到一個想法。 –

回答

0

您正在獲取column ambiguously defined,因爲oracle無法確定哪個表的manager_id應該用於group by,因爲您尚未指定它。正確的查詢是:

SELECT M.MANAGER_ID 
FROM EMPLOYEE E 
LEFT OUTER JOIN MANAGER M 
ON E.MANAGER_ID=M.MANAGER_ID 
connect by NOCYCLE m.manager_id=prior e.employee_id 
GROUP BY m.manager_id; 
+0

SELECT M.MANAGER_ID FROM EMPLOYEEË LEFT OUTER JOIN管理者M ON E.MANAGER_ID = M.MANAGER_ID CONNECT BY NOCYCLE m.manager_id = PRIOR e.employee_id GROUP BY e.employee_id; 和怎麼樣這個查詢 – saurabhk

+0

SELECT M.MANAGER_ID FROM EMPLOYEEË LEFT OUTER JOIN管理者M ON E.MANAGER_ID = M.MANAGER_ID CONNECT BY NOCYCLE m.manager_id = PRIOR e.employee_id 其中經理標識= 10 GROUP BY m.manager_id – saurabhk

+0

當使用'groupby'時,你應該只有你選擇的那些列。因此,如果您按員工編號進行分組,您選擇的部分應該只有員工編號,而不是管理員編號,因爲您尚未在組中使用該編號。 – thiyaga

0

在GROUP BY列經理標識不明確 - 它可能是僱員表的經理標識,以及管理者表的經理標識。

您還需要將其餘列添加到您的GROUP BY。然後,將完整的查詢變爲:

SELECT 
    E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME, 
    E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE 
FROM EMPLOYEE E 
LEFT OUTER JOIN MANAGER M 
    ON E.MANAGER_ID=M.MANAGER_ID 
connect by NOCYCLE m.manager_id=prior e.employee_id 
GROUP BY 
    E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME, 
    E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE;