2015-03-14 2 views
0

Имеются три таблицы. СУБД - это Oracle 10g.Выберите самую высокую ассоциацию, если заданный уровень записи является случайным.

Сотрудники = отдельный работник запись

  • emp_id (ПК)
  • Emp_name
  • различных детали полого

отдела = содержит иерархическую структуру орга

  • Dept_code (PK)
  • Название отдела
  • parent_id (относится к dept_code в той же таблице для родительского отдела)
  • DEPTH_LEVEL (1 = самый высокий уровень, 2 = суб-Depts из 1, и т.д. ... макс = 6)
  • различные подробности поля

сотрудников Ассоциации = картографирования в отделах

  • Assoc_id (рк)
  • emp_id (Ф.К.)
  • dept_code (Ф.К.)
  • другие поля, которые относятся различные типы ассоциаций

Если объединение карт сотрудников отделов на различных глубинах, я хочу, чтобы выполнить запрос, который подсчитывает всех сотрудников, сгруппированных на глубине = 2. Если сотрудник работает в отделе на уровне 6, мне нужно будет разрешить уровень 5, затем уровень 4, затем уровень 3, чтобы перейти на уровень 2, но если они работают в отделе на уровне 3, мне нужно только решить до уровня 2.

Попытка выяснить наиболее эффективный способ. Пока я просматриваю 5 отдельных запросов, по одному для каждой глубины с различным количеством подзапросов, чтобы разрешить уровни глубины, а затем объединить с объединением. Моя вторая мысль заключалась в создании статической справочной таблицы для сопоставления каждого кода отдела с меткой уровня 2, но сохранение этой таблицы было бы проблематичным.

У кого-нибудь есть идеи?

+1

Похоже, что вам нужна [иерархический запрос] (http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm). Не могли бы вы прикрепить код, чтобы мы знали, что вы делаете? И желаемый выход? Заголовок вопроса и эта часть: _ «Я хочу запустить запрос, который считает всех сотрудников» _, немного запутанным. Любые детали ценны. –

+0

Я вижу вашу точку зрения, я имел в виду, что я хотел бы иметь возможность группировать записи на самом высоком уровне, независимо от того, считаю ли я сотрудников или перечисляю их, причем целью является их объединение на заданном уровне. Я только что решил проблему несколько минут назад, используя рекурсивный CTE, который был именно тем, что я искал. – gdoucette

ответ

1

Рекурсивный CTE спас день. Я прошу прощения, если мой вопрос не ясен, вот мое решение, хотя я, возможно, изменил некоторые имена полей из исходного сообщения. Я планирую заменить статическое значение U.ID в первой части запроса объединения с параметром, который будет иметь код отдела и получить его соответствующие подчиненные отделы.

В этом случае департаментный код «5000002» - это ИТ-отдел, результаты отображают всех сотрудников на разных уровнях иерархии ИТ-отдела.

select r.full_name, r.id, u.dept_name, u.dept_id, u.dept_level 
from clarity.srm_resources r, 
clarity.PRJ_OBS_ASSOCIATIONS a, 
(with DIRECT_DEPT (Parent_ID, Dept_ID, Dept_Name, Dept_Level) 
as 
(
SELECT U.PARENT_ID, U.ID AS DEPT_ID, U.NAME AS DEPT_NAME, 0 AS Dept_Level 
FROM clarity.prj_obs_units u 
where u.type_id = '5000001' 
AND U.ID = '5000002' 
UNION ALL 
SELECT U.PARENT_ID, U.ID AS DEPT_ID, U.NAME AS DEPT_NAME, Dept_Level +1 
FROM clarity.prj_obs_units u 
INNER JOIN DIRECT_DEPT D 
ON U.PARENT_ID = D.DEPT_ID 
where u.type_id = '5000001' 
) 
SELECT Parent_ID, Dept_ID, Dept_Name, Dept_Level 
FROM DIRECT_DEPT) u 
where a.record_id = r.id 
and a.unit_id = u.dept_id 
and a.table_name ='SRM_RESOURCES' 
and r.is_active = '1' 
;