2017-10-19 12 views
0

テーブルに隣接ツリーを格納します。ツリー内の各ノードのすべてのアセンダントを見つけるために、再帰的な共通テーブル式を書きました。 だから私は特定のIDを含む配列をすべて検索するPostgres

SELECT * FROM TREE;を書くとき、私はこの取得:

id | ancestors 
----+--------------- 
    0 | {} <- ROOT 
    1 | {0} 
    2 | {0} 
    4 | {0} 
19 | {0} 
45 | {0} 
    3 | {0,1} 
    5 | {0,4} 
    6 | {0,4} 
    8 | {0,4} 
11 | {0,1} 
22 | {0,2} 
    7 | {0,4,5} 
    9 | {0,4,6} 

私はそれぞれの固有IDの私はアレイの数を見つけたいので、ツリー内の各ノードのすべての子孫の量を取得したいですそのようなIDを含む祖先列。

私は手動でそれを行うことができますが、唯一の1つのIDについて:このクエリの

SELECT count(*) from tree 
WHERE 0 = any(tree.ancestors); 

、ID = 0のノードがルートである場合、それは木に私のすべてのノードの量マイナス1を与える必要があります。

私はこのような何か書き込もうとしました:

SELECT count(*) from tree 
WHERE id = any(tree.ancestors) 
group by id; 

をしかし、それは実際には0行を返します。あなたは、各idのためにツリー全体を検索したい

答えて

1

は、それが条件で、自己結合です:あなたはそのドン」ものとすべてidsを(取得したい場合は、left joinを使用する必要があります

with tree(id, ancestors) as (
values 
    (0, '{}'::int[]), 
    (1, '{0}'), 
    (2, '{0}'), 
    (4, '{0}'), 
    (19, '{0}'), 
    (45, '{0}'), 
    (3, '{0,1}'), 
    (5, '{0,4}'), 
    (6, '{0,4}'), 
    (8, '{0,4}'), 
    (11, '{0,1}'), 
    (22, '{0,2}'), 
    (7, '{0,4,5}'), 
    (9, '{0,4,6}') 
) 

select t1.id, count(t2.*) 
from tree t1 
join tree t2 on t1.id = any(t2.ancestors) 
group by 1 
order by 1 

id | count 
----+------- 
    0 | 13 
    1 |  2 
    2 |  1 
    4 |  5 
    5 |  1 
    6 |  1 
(6 rows) 

注意tはancestorsに表示されます)。

関連する問題