Найти записи таблицы, которые не соответствуют иерархической структуре сверху вниз - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть денормализованная таблица, которую я пытаюсь оценить на предмет иерархических проблем.Правильный формат - иерархическая структура сверху вниз для большой организации.Концептуально, у каждого должен быть только один менеджер отчетов, но поскольку он денормализован, это не всегда так.Я хочу найти все записи, в которых конкретный сотрудник имеет более одного менеджера по отчетности.Вот некоторые примеры данных:

LVL1_First_Name|LVL1_Last_Name|LVL1_Emp_ID|LVL2_First_Name|LVL2_Last_Name|LVL2_Emp_ID|LVL3_First_Name|LVL3_Last_Name|LVL3_Emp_ID
---------------+--------------+-----------+---------------+--------------+-----------+---------------+--------------+-----------
Jack           |Gorshon       |0001       |Henry          |Johnson       |0003       |Amy            |Taylor        |0005
Robert         |Harris        |0002       |Henry          |Johnson       |0003       |Nick           |Greer         |0006
Robert         |Harris        |0002       |Jim            |Balial        |0004       |Josh           |Wolfe         |0007

Как видите, существует проблема с иерархией, когда Генри Джонсон сообщает обоим Роберту и Джеку.Я пытаюсь создать оператор SQL, который вытащил бы первые две записи этой таблицы, потому что они не следуют истинной иерархии сверху вниз.

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

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

1 Ответ

0 голосов
/ 11 февраля 2019

Хммм.,,Вы можете отключить данные для их нормализации, а затем агрегировать:

select v.emp_id, min(lev), max(lev)
from t cross apply 
     (values (LVL1_Emp_ID, LVL2_Emp_ID, 2), (LVL1_Emp_ID, LVL3_Emp_ID, 3)
     ) v(parent_emp_id, emp_id, lev)
from v.emp_id
group by v.emp_id
having min(parent_emp_id) <> max(parent_emp_id);
...