2016-07-11 11 views
0

私は階層構造を持つtodoリストを構築しています。それに良いロジックを探していて、それが隣接リストにあることが分かりました。隣接リストとしての階層的ToDoList

ゴールは、階層的なタスクを持つ予定リストを実行できるようにすることです(1つのタスクがルートであり、ノードを持つことができます。ノードには独自のノードなどがあります)。

enter image description here

そして私は私のすべての根を示してクエリをしたい、といくつかのルートノードを持っている場合は、そのようにそれを示していますテーブル

CREATE TABLE [dbo].[Tasks](
[Id] [int] IDENTITY(1,1) NOT NULL, 
[Name] [nvarchar](max) NOT NULL, 
[Owner] [nvarchar](max) NOT NULL, 
[Parent] [int] NULL, 

データを挿入した後、テーブルは次のようになりますよく

私のクエリは

SELECT t.*, COUNT(tr.Parent) as SubCount 
FROM Tasks t 
INNER JOIN Tasks tr on t.Id = tr.Parent 
GROUP BY t.Name, t.Owner, t.Id, t.Parent 
UNION 
SELECT t.*, 0 as SubCount 
FROM Tasks t 
where Parent IS NULL; 

ですが、結果は次のとおりです。

enter image description here

期待される結果は、親との行のみを表示する必要があります例えば、NULLとサブ・ノードを持つ行です。

enter image description here

どのようなショーuldはここで正しいクエリでしょうか?

答えて

1

SELECT 
    T.Id, 
    T.Name, 
    T.Owner, 
    T.Parent, 
    (SELECT COUNT(IT.Id) FROM Tasks IT WHERE IT.Parent = T.Id) AS SubCount 
FROM 
    Tasks T 
WHERE 
    T.Parent IS NULL 
+0

うんが@Hebeleが(ちょうど私がCOUNTを変更(1)私を与えるために)(同上をカウントするために素晴らしい:)のおかげで動作しますより正確な答え) – eyalewin

0

はちょうどこれを試してみてください、これを試してみてください。、

select id, name , owner, parent,sum(SubCount) SubCount 
from(
SELECT t.*, COUNT(tr.Parent) as SubCount 
FROM Tasks t 
INNER JOIN Tasks tr on t.Id = tr.Parent 
GROUP BY t.Name, t.Owner, t.Id, t.Parent 
UNION 
SELECT t.*, 0 as SubCount 
FROM Tasks t 
where Parent IS NULL; 
)d 
group by id, name , owner, parent 
+0

このクエリは私にも親がnullでない行を与えます。 – eyalewin

+0

ええ、あなたは正しいです。私はちょうど上記のデータのためにそれを行う。 – DineshDB