Запросить сотрудника из двух или нескольких отделов

При выполнении запроса возникает ошибка. Я не знаю, какая проблема. Я пытаюсь запросить БД, чтобы узнать сотрудников из двух или более отделов. (т.е. Staff_ID = 1, работает под DEPT_ID = 4 и 6). Существуют три таблицы:

1. STAFF 2. DEPARTMENT 3. STAFF_DEPT (contains ID of STAFF and DEPT) 

Вот что я сделал,

 SELECT sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", d.DEPT_NAME AS "Department" FROM STAFF_DEPT sd INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID GROUP BY sd.STAFF_ID HAVING COUNT (sd.STAFF_ID) > 1 

Вот ваш оригинальный запрос:

 SELECT sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", d.DEPT_NAME AS "Department" FROM STAFF_DEPT sd INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID GROUP BY sd.STAFF_ID HAVING COUNT (sd.STAFF_ID) > 1; 

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

 SELECT sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", list_agg(d.DEPT_NAME, ',') within group (order by DEPT_NAME) AS "Department_List" FROM STAFF_DEPT sd INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID GROUP BY sd.STAFF_ID, s.STAFF_Name HAVING COUNT (sd.STAFF_ID) > 1; 

Обратите внимание: я добавляю list_agg() в select и s.staff_name в group by .

Если вам нужен один человек / отдел на строку, используйте подзапрос с аналитической функцией:

 selectsd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", dept_name from (select sd.staff_id, s.staff_name, d.dept_name, count(*) over (partition by sd.staff_id, s.staff_name) as NumDepts FROM STAFF_DEPT sd INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID ) t where NumDepts > 1; 

Попробуй это:

 with temp as (select sd.staff_id from staff_dept sd group by staff_id having count(staff_id)>1) select tp.staff_id||' ' ||s.Name AS "Staff Name", d.DNAME FROM temp tp, staff_dept sd, staff s, dept d where tp.staff_id=sd.staff_id and sd.staff_id=s.id and sd.dept_id=d.deptno; 

Я сохранил staff_id со счетом более 1 во временном представлении и использовал его в окончательном запросе выбора.

Как я уже упоминал в techdo, что вы не можете группировать по sd.STAFF_ID || '' || s.STAFF_NAME, d.DEPT_NAME, поскольку он всегда был бы уникальным и всегда считался бы 1.

Пожалуйста попробуйте:

 SELECT sd.STAFF_ID || ' ' || s.STAFF_NAME AS "Staff Name", d.DEPT_NAME AS "Department" FROM STAFF_DEPT sd INNER JOIN STAFF s ON sd.STAFF_ID = s.STAFF_ID INNER JOIN DEPARTMENT d ON sd.DEPT_ID = d.DEPT_ID GROUP BY sd.STAFF_ID || ' ' || s.STAFF_NAME, d.DEPT_NAME HAVING COUNT (sd.STAFF_ID) > 1