0

最初に関連するスキーマ:

A は、ListID、Date、および ItemID を含むリスト エントリのテーブルです。

B は、ID と所有者 (現在はテキスト) を持つ基になるアイテムのテーブルです。

C は、ID (int)、名前 (varchar)、および親 (int) を持つ所有者のテーブルです。Parent は、別のメンバーの ID か、トップレベル ノードの場合は null です。このテーブルの深さは 2 レベルのみであるため、すべてのメンバーは子または親のいずれかです。

A.ItemID は B.ID を指します B.Owner は C.Name を指します C.Parent は null または別の C.ID を指します

今問題...

C の親ごとに、特定のリスト (ListID と Date) のエントリ数をカウントする必要があります。1 つの問題でほとんど解決できません。クエリは次のとおりです。

select C.owner, COUNT(B.ID) as Count from A  
join B on A.ItemID = B.ID  
join C on B.Owner= C.Owner  
join C2 on C.Parent = C2.ID   
Where date = '2011-01-10' and ListID = 1  
Group by C2.Owner  
order by C2.Owner  

ただし、C の子行と一致するエントリのみをカウントしています。親行は親フィールドに独自の ID を持っていないため、直接所有されているアイテムがあっても集計カウントには含まれません。これらの値を入れることで問題を解決できると確信していますが、それらの行が事実上自分の親になるため、それは悪い設計のように思えます。

これを説明するためにこのクエリを管理する方法はありますか? 私は困惑しています。

あるいは、自分のデータを子のデータと集約する目的で、行が自分自身を親として参照することは「大丈夫」ですか?

ここですべてのアドバイスをありがとう。これが明確でない場合は、より具体的に説明できますが、関係のない情報は避けようとしています。

-ダン

4

1 に答える 1

0

CとC2では左結合を使用する必要があります。

C LEFT JOIN C2 ON C.Parent = C2.ID

これにより、すべての行がCから含まれ、C2に対応する子がある場合は、それも含まれます。

于 2011-01-10T22:46:27.463 に答える