0
にリレーショナルテーブル内に捕捉ツリー内のすべてのノードを収集:は、私は次のスキーマを持つテーブルを持っているSQL Serverの
あなたが見ることができるようにCREATE TABLE Feature
(
FeatureId INT IDENTITY(1,1),
ParentFeatureId INT,
TargetObjectType VARCHAR(64)
)
が、それは機能のツリーを定義します。私は、特定のノードの下にあるすべての子孫を収集することに興味があります。
私の現在のソリューションは、私にはかなり厄介なようだ:
IF OBJECT_ID('tempdb..#features') IS NOT NULL
DROP TABLE #features
SELECT
0 FeatureId, TargetObjectType, ParentFeatureID
INTO
#features
FROM
Feature
WHERE
1 = 0
INSERT INTO #features
SELECT
FeatureId, TargetObjectType, ParentFeatureID
FROM
Feature
WHERE
TargetObjectType IN ('Root1', 'Root2')
WHILE @@ROWCOUNT > 0
INSERT INTO #features
SELECT FeatureId, TargetObjectType, ParentFeatureID
FROM Feature f
WHERE ParentFeatureID IN (SELECT FeatureId FROM #features)
AND NOT EXISTS (SELECT 1 FROM #features WHERE FeatureId = f.FeatureId)
SELECT * FROM #features
はそれを行うためのよりエレガントな方法はありますか?おそらく再帰的なCTEを使用していますか?
データ量は重要ではありません(最大で数千レコード)。すべてのデータは、階層レベルがほんの少し、たとえば最大7つのフォレストを表します。
はい再帰CTEは、おそらくここでの最良の選択肢である
WHERE e.FeatureId = @lookupFeatureId
するCTEの最初のselect文でWHERE
句を変更します。 –再帰CTEの作成についてのヘルプが必要な場合は、http://stackoverflow.com/questions/18106947/cte-recursion-to-get-tree-hierarchyをご覧ください。 –