查找与自上而下的层次结构不匹配的表记录

时间:2019-02-11 19:02:10

标签: sql sql-server hierarchy denormalized

我有一个非正规化的表,我正在尝试评估其层次结构问题。正确的格式是大型组织的自上而下的层次结构。从概念上讲,每个人都应该只有一个报告经理,但是由于它是非规范化的,所以并非总是如此。我想查找特定雇员有多个报告经理的所有记录。这是一些示例数据:

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 :(得分:2)

嗯。 。 。您可以取消对数据进行归一化以使其标准化,然后进行汇总:

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);