2013-02-27 196 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