0

ソースノードが与えられた場合、その「下」にあるすべてのノードを取得したいと思います。ここで、underとは、レベルが指定されたノードのレベルよりも低く、指定されたノードから到達可能なすべてのノードを意味します。これは一般的なテーブル式を使用して実行できることを覚えており、現在取り組んでいます。ただし、大きなグラフ(約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
4

1 に答える 1

1

ここで考えられる解決策の1つは、再帰CTEを使用することですが、これにはまだいくつかの問題があります(答えはまだ完全には一致していませんが、そこに到達しています)。最終的な要件に近づいたら、このクエリを更新します。

編集1:以下は、ルートノード「A」を要求する出力を除くすべての出力を満たしました。この場合、何らかの理由で1レベルだけ深くなります。

編集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
于 2013-02-27T19:37:22.017 に答える