查找表中的记录不匹配的自顶向下的层次结构,

问题描述 投票:0回答:1

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

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语句。

我试图用一组由...有语句来解决这个问题,但没有得到我,我需要的结果。

注:我不负责这个数据格式。我的目标是清理它,并把它变成一个适当的,标准化的数据结构前,它清理干净。

sql sql-server hierarchy denormalized
1个回答
2
投票

嗯。 。 。你可以UNPIVOT数据正常化,然后汇总:

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);
© www.soinside.com 2019 - 2024. All rights reserved.