私はSQLServer2008を使用しています。これが私がやろうとしていることです。marketgroupIDとparentIDのテーブルがあります。各マーケットグループには名前があります。それらの名前の階層パスを作成したいと思います。
WITHアンカーステートメントrecursive_statementを使用してCTEソリューションを試しました。それはうまくいきませんでした。
新しいテーブルを作成し、値を繰り返し入力する別の解決策を見つけました。これは最もパフォーマンスが高くなく、多くのデータと列を複製しますが、比較的小さなデータベースでの1回限りのプロセスであるため、あまり気にしません。私は単純な解決策を探しています(私が推測するすべての人のように)
基本的に、テーブルを正常に作成し、その中にいくつかの値をコピーしました。
--Create Lineage Table
Create Table Eve.dbo.invLineage(
Node int NOT NULL IDENTITY(100,1),
typeID int,
parentNode int,
marketGroupName nvarchar(100),
marketGroupID int,
Depth tinyint,
Lineage nvarchar(max)
)
それに値をコピーしました。
INSERT INTO EVE.dbo.invLineage ( typeID,marketGroupID)
SELECT [EVE].[dbo].invTypes.typeID,EVE.dbo.invTypes.marketGroupID
FROM EVE.dbo.invTypes
LEFT JOIN eve.dbo.invGroups ON EVE.dbo.invTypes.groupID= eve.dbo.invGroups.groupID
WHERE eve.dbo.invGroups.categoryID=7 AND Eve.dbo.invTypes.published=1
これは、この段階で得られる結果の例です。
Node typeID parentNode marketGroupName marketGroupID Depth Lineage
100 377 NULL NULL 605 NULL NULL
101 380 NULL NULL 605 NULL NULL
102 393 NULL NULL 126 NULL NULL
103 394 NULL NULL 126 NULL NULL
104 399 NULL NULL 609 NULL NULL
105 400 NULL NULL 609 NULL NULL
106 405 NULL NULL 604 NULL NULL
107 406 NULL NULL 604 NULL NULL
そのため、nodeID、typeID、marketGroupIDを正常に取得できました。ここの表示が悪いので申し訳ありませんが、私はまだフォーラムを学んでいます。
ここで、Lineageテーブルの各行のparentNodeを更新したいと思います。
この情報は、marketGroupテーブルの列です。
これが私が書いたリクエストですが、それは0行を返します。
UPDATE T SET T.parentNode=P.Node
FROM Eve.dbo.invLineage as T
INNER JOIN eve.dbo.invMarketGroups E ON T.marketGroupID=E.marketGroupID
INNER JOIN eve.dbo.invMarketGroups B ON E.parentGroupID=B.marketGroupID
INNER JOIN Eve.dbo.invLineage P ON B.marketGroupID=P.marketGroupID
最初の2つの内部結合は正常に機能しているように見えますが、最後の結合では0行が返されます。
また、私はこの便利なガイドに従っています:http ://www.sqlteam.com/article/more-trees-hierarchies-in-sql
デバッグ目的でこのselectクエリを実行した場合に得られる結果は次のとおりです。
SELECT * --SET T.parentNode=P.Node
FROM Eve.dbo.invLineage as T
INNER JOIN eve.dbo.invMarketGroups E ON T.marketGroupID=E.marketGroupID
INNER JOIN eve.dbo.invMarketGroups B ON E.parentGroupID=B.marketGroupID
--INNER JOIN eve.dbo.invLineage P ON B.marketGroupID=P.marketGroupID
Node typeID parentNode marketGroupName marketGroupID Depth Lineage marketGroupID parentGroupID marketGroupName description iconID hasTypes marketGroupID parentGroupID marketGroupName description iconID hasTypes
1134 10039 NULL NULL 760 NULL NULL 760 9 Civilian Modules Modules whose specifications are geared toward use on rookie ships. NULL 1 9 NULL Ship Equipment Everything the dedicated pilot needs to outfit their ship. 1432 0
2913 21853 NULL NULL 760 NULL NULL 760 9 Civilian Modules Modules whose specifications are geared toward use on rookie ships. NULL 1 9 NULL Ship Equipment Everything the dedicated pilot needs to outfit their ship. 1432 0