【发布时间】:2019-07-02 04:52:45
【问题描述】:
我在 SQL Server 2012 中有下面的表结构
INSERT INTO tblLocations (Relation, ParentID, Name, Levelnumber, Code)
VALUES
('Parent', NULL, 'West',0,'X'),
('Child', 1, 'WA',1,'X'),
('Grandchild', 2, 'Seattle',2,'X'),
('Grandchild', 2, 'Seattle2',2,'X'),
('GreatGrandchild', 3, 'aa',3,'X'),
('GreatGrandchild', 3, 'bb',3,'X'),
('Parent', NULL, 'MidWest',0,'Y'),
('Child', 7, 'IL',1,'Y'),
('Grandchild', 8, 'Chicago',2,'Y'),
('Grandchild',8, 'Chicago1',2,'Y'),
('GreatGrandchild', 9, 'cc',3,'Y'),
('GreatGrandchild', 9, 'dd',3,'Y'),
('Parent', NULL, 'South',0,'Z'),
('Child', 13, 'TX',1,'Z'),
('GreatGrandchild', 14, 'ff',3,'Z'),
('GreatGrandchild', 14, 'ff',3,'Z'),
('Parent', NULL, 'North',0,'A'),
('Grandchild',17, 'Chicago1',2,'A'),
('GreatGrandchild', 18, 'ff',3,'A'),
('GreatGrandchild', 18, 'ff',3,'A');
正如我们所见,并非所有节点都存在某些级别。我们的要求是获得所有节点的所有级别。
例如,对于代码 X
Parent -> Child -> GrandChild --> GreatGrandchild
层次结构在那里.. 但是对于代码 A,我们有
Parent -> GrandChild -> GreatGrandChild
代码 Z 也是如此:
Parent -> Child -> GreatGrandChild
我们的要求是,如果一个级别不存在,则应为缺少的级别填充后续级别(由级别编号标识)。我们只有 4 个关卡..
我们总是需要
Parent -> Child (if child is not there search down (Grandchild / GreatGrandchild) until data is there and populate as Child)
-> GrandChild - > GreatGrandChild
这是我们得到的 CTE,
WITH Hierarchy AS
(
-- initialization
SELECT Relation, ParentID, Name, Levelnumber, Code
FROM tblLocations
WHERE LevelNumber = 0
UNION ALL
-- recursive execution
SELECT S.Relation, S.ParentID,S.Name,S.Levelnumber, S.Code
FROM tblLocations S
INNER JOIN tblLocations T ON T.Id = S.ParentId
)
SELECT *
FROM Hierarchy
WHERE Code = 'X' ;
我们需要它在视图中,所以不需要 T-SQL。
请指导
【问题讨论】:
标签: sql sql-server