2012-04-20 14 views
1

私はSQL Server 2008を使用しています。ここで私がやろうとしていることがあります。私はmarketgroupIDとparentIDを持つテーブルを持っています。各マーケットグループには名前があります。これらの名前の階層パスを作成したいと思います。このSQL Serverクエリで行に影響するのはなぜですか?

私はWITH anchor_statement 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 

これは私がこの段階で取得結果のexempleです:

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 

だから私は成功したノードID、型ID、および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つの内部結合は正常に動作しているようですが、最後の1つでは0行が返されます。また、私はこの便利なガイド以下のよ

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 
+0

marketGroupIDが一致する 'invMarketGroups'テーブルの行はありますか? – Paddy

+4

最初の2つのインジャージョインでSELECTを実行すると、何が得られますか?データを表示できますか?私にとっては簡単な答えは 'あなたのP.marketGroupIDのどれかにマッチするB.marketGroupIDはありません。 '... – MatBailie

+0

私はそう信じています。私はあなたにいくつかの結果を示すことができました。 – darthun08

答えて

3

どちらもあなたの記録は、B.marketGroupID = 9を持っている:ここではhttp://www.sqlteam.com/article/more-trees-hierarchies-in-sql

は私がデバッグ目的のためにこの選択クエリを実行する場合取得するいくつかの結果です。

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

を持っているON B.marketGroupID=P.marketGroupIDは、任意のマッチを見つけたことがないので、簡単に言えば、あなたは何のレコードを取得しません。

+0

私は多くのうち3行しか表示していませんでした。何とか私はテーブルにデータをコピーしたとき、私はあまりにも多くの検索を制限しました。 – darthun08

+0

私はmarketGroupsを直接変更することに移ります。ありがとうございました。 – darthun08

関連する問題