2013-02-27 98 views
0

给定一个源节点,我想让所有节点“在”它下面,这意味着所有节点的级别小于给定节点的级别并且可以从给定节点到达。我记得这可以使用通用表格表达式来完成,并且正在处理它。但是,有没有办法在一个大图(由大约100K个节点组成)上快速执行此操作?在给定节点下获取节点?

的样本数据:

CREATE TABLE #TEMP(Source VARCHAR(50), SourceLevel INT, Sink VARCHAR(50), SinkLevel INT); 


INSERT INTO #TEMP VALUES('A', 1, 'B', 2); 
INSERT INTO #TEMP VALUES('A', 1, 'C', 2); 
INSERT INTO #TEMP VALUES('B', 2, 'C', 2); 
INSERT INTO #TEMP VALUES('B', 2, 'D', 3); 
INSERT INTO #TEMP VALUES('B', 2, 'E', 3); 
INSERT INTO #TEMP VALUES('C', 2, 'D', 3); 
INSERT INTO #TEMP VALUES('C', 2, 'F', 3); 
INSERT INTO #TEMP VALUES('C', 2, 'G', 3); 


SELECT * 
FROM #TEMP 

GO 

DROP TABLE #TEMP 
GO 

图:

 A      Level - 1 
    /\ 
    B---C      Level - 2 
/\ /|\ 
    E D F G     Level - 3 

例子:

  • 鉴于B,我想:E,d
  • 鉴于A,我想:B,C,E,d,F,G
  • 鉴于C,我想:d,F,G
+0

[检查。] [1]这可能会回答你的问题 [1]:http://stackoverflow.com/questions/4188427/sql-query-for-parent-child -chain – SP007 2013-02-27 19:28:06

+0

@helloSuresh:谢谢!我已经开始通过递归CTE来做这件事,并提供了一个可能的解决方案。 – Legend 2013-02-27 19:39:44

回答

1

一个可能的解决方案在这里,使用Recursive CTEs但这仍然有一些问题(答案并不完全匹配,但它到达那里)。一旦我接近我的最终需求,我将更新此查询。

编辑1:除了要求根节点'A'的情况之外,以下满足所有输出,在这种情况下,由于某种原因,它只进入一级深度。

编辑2:这给出了预期的输出。我现在将检查其他用例。

;WITH HIERARCHY AS (
    SELECT T.Source, T.SourceLevel, T.Sink, T.SinkLevel 
    FROM #TEMP T 
    WHERE T.Source = 'A' 
    AND T.SourceLevel < T.SinkLevel 
UNION ALL 
SELECT X.Source, X.SourceLevel, X.Sink, X.SinkLevel 
    FROM #TEMP X 
    JOIN HIERARCHY H ON H.Sink = X.Source 
) 
SELECT DISTINCT H.Sink 
    FROM HIERARCHY H