1

私は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
4

1 に答える 1

3

両方のレコードにB.marketGroupID = 9

しかし、あなたのeve.dbo.invLineageテーブルにはmarketGroupID IN (605, 126, 209, 604)

つまり、ON B.marketGroupID=P.marketGroupID一致するものが見つからないため、レコードは取得されません。

于 2012-04-20T14:06:55.400 に答える