2013-12-17 4 views
0

Мой код работает отлично, используя запрос:группа по выражению не работает должным образом?

CREATE TABLE employee (employee_id INTEGER, manager_id INTEGER, first_name VARCHAR2(10) NOT NULL, last_name VARCHAR2(10) NOT NULL, title VARCHAR2(20), salary NUMBER(6, 0)); 

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) Here are my tables 

SELECT 
DISTINCT E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME, 
E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE, level 
FROM EMPLOYEE E 
LEFT OUTER JOIN MANAGER M 
ON E.MANAGER_ID=M.MANAGER_ID 
WHERE m.manager_id=10 
start with e.employee_id >0 
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,LEVEL 

, но я хочу, чтобы мой результат установлен сгруппированных лишь на employee_id и не во всех областях

Когда я использовать этот запрос ниже, то ошибка генерирует «НЕ A GROUP BY EXPRESSION "

SELECT 
DISTINCT E.EMPLOYEE_ID, M.MANAGER_ID, E.FIRST_NAME, 
E.LAST_NAME, CONNECT_BY_ISLEAF, CONNECT_BY_ISCYCLE, level 
FROM EMPLOYEE E 
LEFT OUTER JOIN MANAGER M 
ON E.MANAGER_ID=M.MANAGER_ID 
WHERE m.manager_id=10 
start with e.employee_id >0 
connect by NOCYCLE m.manager_id=prior e.employee_id 
GROUP BY 
E.EMPLOYEE_ID 

Что-то случилось с этим вопросом?

+1

Вы не можете выбрать столбцы, отсутствующие в группе, до тех пор, пока мы не будем использовать какую-либо функцию агрегата. –

+0

Так что же мне делать? – saurabhk

+0

, если вы хотите просто сгруппировать по employee_id. Просто удалите все столбцы, кроме employee_id. Если вы объясните требования я могу помочь вам больше –

ответ

1

Я предполагаю, что ваш идентификатор сотрудника уникален, поэтому, группируя его, вы группируете все остальное в запросе. Но Oracle этого не знает. Если вы группировались только по идентификатору сотрудника, и у вас было два сотрудника с одинаковым идентификатором, один с фамилией «Смит» и один с фамилией «Миллер», какой из них вы хотели бы увидеть? Это либо Смит, либо Миллер, поскольку у вас есть только одна строка данных, поэтому база данных не знает, что делать.

Вот почему вам всегда приходится группировать каждый столбец, который не агрегирован (используя SUM, MAX, MIN или одну из других функций).

Вы можете опустить столбцы из вашего результирующего набора и группы, а затем поместить весь запрос в подзапрос, с внешним запросом, выбрав остальные столбцы из соединения подзапроса и таблицы сотрудников. Но поверьте мне, вы действительно не хотите этого делать, поскольку эта версия будет намного уродливее, чтобы читать и понимать, чем ваш текущий запрос.

+0

не уникальна ключ в таблицах – saurabhk

+0

Это может быть, но это не меняет мой ответ. Каждый столбец в результирующем наборе должен либо иметь агрегатную функцию, либо должен быть включен в группу по списку. –

Смежные вопросы