2017-08-25 72 views
1

我有以下[AllPathsTbl],我想寫一個查詢,當我傳遞一個節點名稱時,它將選擇鏈接到該節點的行也間接通過其他鏈接IE)MS SQL查詢,將選擇所有鏈接的節點對的D3桑基圖

SELECT * FROM [AllPathsTbl]

Node1 Node2 TotalValue 
D1 Q1 4693094 
D2 Q2 1144506 
D3 Q3 881685 
D4 Q4 2232370 
D5 Q5 861860 
D6 Q6 27750 
D7 Q7 119430 
D8 Q8 26200 
D9 Q9 2054170 
E1 P1 17275 
E2 P1 36675 
E3 P2 323400 
E3 P1 242910 
E4 P3 133070 
E4 P4 834600 
E4 P1 375800 
E4 P5 888900 
E5 P6 186263 
E5 P7 33609 
E6 P6 464289 
E7 P6 1343779 
I13 R15 323400 
I16 R15 1427130 
I17 R16 1399071 
P2 I13 323400 
P3 I16 133070 
P4 I16 834600 
P6 I17 1399071 
P1 I16 672660 
Q5 E3 861860 
Q4 E4 2232370 
Q3 E5 881685 
Q2 E8 100 
Q2 E6 1144506 
Q1 E7 4693094 
Q6 E1 17275 
Q6 E2 10475 
Q8 E2 26200 
Q7 E9 119430 
Q9 E8 370070 

預期輸出爲例如P5或E4(或基本上任何從見下表)節點將總是這樣:

SELECT * FROM [dbo].[FilteredPathsTbl]('E4')

Node1 Node2 TotalValue 
D4 Q4 2232370 
D5 Q5 861860 
D6 Q6 27750 
D8 Q8 26200 
E1 P1 17275 
E2 P1 36675 
E3 P2 323400 
E3 P1 242910 
E4 P3 133070 
E4 P4 834600 
E4 P1 375800 
E4 P5 888900 
I13 R15 323400 
I16 R15 1427130 
P2 I13 323400 
P3 I16 133070 
P4 I16 834600 
P1 I16 672660 
Q5 E3 861860 
Q4 E4 2232370 
Q6 E1 17275 
Q6 E2 10475 
Q8 E2 26200 

圖形表示:

sankey diagram

需要幫助,因爲我沒有更多的頭髮拉;)

+0

應該有SELECT * FROM [DBO] .FilteredPathsTbl之一('E4')不是SELECT * FROM [dbo] .FilteredPathsTbl – Pawel

+0

你有一些你有「節點連接」的表嗎? – Veljko89

+0

嗨Veljko89。我創建了SQLFiddle與節點之間的連接:http://sqlfiddle.com/#!6/78d07a/41有40個鏈接,目的是當例如'P4'被查詢時根據「圖形表示​​」返回ony 23 – Pawel

回答

0

你想,這是什麼遞歸CTE,下面是一個工作查詢爲您提供的數據。一些快速的檢查後,它似乎工作,並提供鏈接來回的你,顯然,如果你只想要一個方向僅使用熱膨脹係數

DECLARE @startnode VARCHAR(10) = 'P4'; 

WITH path_nodes_cte_left 
AS (
    SELECT node1, 
     node2, 
     t.total_value, 
     0 LEVEL 
    FROM allpathstbl t 
    WHERE node2 = @startnode 

    UNION ALL 

    SELECT to_left.node1, 
     to_left.node2, 
     to_left.total_value, 
     LEVEL - 1 LEVEL 
    FROM allpathstbl to_left 
    INNER JOIN path_nodes_cte_left prev ON to_left.node2 = prev.node1 
    ), 
path_nodes_cte_right 
AS (
    SELECT node1, 
     node2, 
     t.total_value, 
     0 LEVEL 
    FROM allpathstbl t 
    WHERE node1 = @startnode 

    UNION ALL 

    SELECT to_right.node1, 
     to_right.node2, 
     to_right.total_value, 
     LEVEL + 1 LEVEL 
    FROM allpathstbl to_right 
    INNER JOIN path_nodes_cte_right next ON to_right.node1 = next.node2 
    ) 
SELECT node1 
FROM path_nodes_cte_left 
WHERE node1 != @startnode 

UNION 

SELECT node1 
FROM path_nodes_cte_right 
WHERE node1 != @startnode 
ORDER BY LEVEL 
+0

您好@ttallierchio和比你的迴應。我嘗試了SQLFiddle中的解決方案,因爲我現在無法訪問工作環境。它看起來像只返回一個深度的鏈接,即對於節點「P4」,它返回5個鏈接:D4-Q4,Q4-E4, E4-P4,P4-I16,I16-R15,目標是返回圖形中的所有23個鏈接。結果模式應該與源表相同,但我可以修改你的代碼http://sqlfiddle.com/#!6/78d07a/40 – Pawel