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

这里有一种可能的解决方案,使用递归 CTE,但这仍然存在一些问题(答案还不完全匹配,但它已经到达那里)。一旦我接近我的最终要求,我会更新这个查询。

编辑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
于 2013-02-27T19:37:22.017 回答