2011-08-18 49 views
0

我有以下數據如何正確地構建從我的SQL數據有n的深度圖

| From | To | 
+------+----+ 
| 1 | 2 | 
| 2 | 3 | 
| 2 | 4 | 
| 5 | 1 | 
| 6 | 5 | 
| 5 | 7 | 
+------+----+ 

現在我想查詢我的數據與CTE增強的選擇,像

DECLARE @start INT; 
SET @start = 1; 
DECLARE @depth INT; 
SET @depth = 1; 

WITH 
[Recursive] AS 
(
    SELECT 
     1 as [level], 
     * 
    FROM [dbo].[myTable] 
    WHERE @start IN ([From], [To]) 
    UNION ALL 
    SELECT 
     t1.[level] + 1, 
     t2.* 
    FROM [Recursive] t1 
    JOIN [dbo].[myTable] t2 
     ON t1.[level] < @depth 
     AND 
     (
      t1.[From] IN (t2.[From], t2.[To]) 
      OR t1.[To] IN (t2.[From], t2.[To]) 
     ) 
) 
SELECT DISTINCT 
    [From], 
    [To] 
FROM [Recursive] 

有了這個小測試數據,性能相當不錯 - 但是當增加數據和深度時,執行會變得非常糟糕(由多列連接引起)。

這樣的任務的正確說法是什麼?

+0

什麼是您的預期產出?你的查詢只返回(1,2)和(5,1),我沒有看到背後的理由。 –

+1

@Lieven我沒有建立一個真正的樹,而是一個圖:每個關係都有一個「From」和一個「To」。一張圖顯示傳入和傳出的關係。這就是爲什麼,如果我們使用3的深度,應該選擇所有支持的記錄 –

+0

是否允許循環?你的數據看起來是單向的,但你似乎希望搜索雙向。這個假設是否正確? –

回答

0

當我在我的客戶端 -side上使用C#時,我最終將所有數據都提交給客戶端,並將其提供給C#中的圖形計算工具。這是更高性能和內存佔用不是問題,我很高興:)

相關問題