2013-12-16 8 views
0

У меня есть две таблицы - сотрудник и менеджер. У одного менеджера много сотрудников. Я хочу показать его в отношениях parent-child, используя команды CONNECT BY и GROUP BY.Невозможно использовать CONNECT BY и GROUP BY вместе

Структура для ЕМРЬОУЕЙ таблицы:

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 

Что не так в этой группе по предложению?

+0

В этом случае вам не нужно «CONNECT BY», просто «LEFT JOIN» достаточно. Также нет необходимости использовать 'GROUP BY', потому что вы не вычисляете какие-либо агрегаты. Я предлагаю вам прочитать документацию по этим предметам, чтобы получить представление о том, когда вы должны его использовать. –

ответ

0

Вы получаете column ambiguously defined, так как oracle не может определить, какая из менеджеров таблицы table_id следует использовать для группы, так как вы не указали его. Правильный запрос является:

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

ВЫБОР M.MANAGER_ID ОТ ЕМРЬОУЕЕ E LEFT OUTER JOIN МЕНЕДЖЕР M ПО E.MANAGER_ID = M.MANAGER_ID CONNECT BY NOCYCLE m.manager_id = Предшествующий уровень e.employee_id GROUP BY e.employee_id; и что об этом запросе – saurabhk

+0

ВЫБОР M.MANAGER_ID ОТ ЕМРЬОУЕЕ E левое внешнее соединение МЕНЕДЖЕР М ПО E.MANAGER_ID = M.MANAGER_ID CONNECT BY NOCYCLE m.manager_id = Предшествующий уровень e.employee_id , где manager_id = 10 GROUP BY m.manager_id – saurabhk

+0

При использовании 'groupby' у вас должны быть только те столбцы в вашем выборе. Поэтому, если вы группируете по идентификатору сотрудника, вы выбираете часть, у которой должен быть только идентификатор сотрудника, а не идентификатор менеджера, поскольку вы не использовали его в своей группе. – thiyaga

0

Колонка manager_id в вашей GROUP BY неоднозначный - это может быть manager_id из таблицы сотрудников, а также manager_id таблицы менеджера.

Вам также необходимо добавить остальные столбцы в свою группу 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;