あなたがして、パスの深さを数えることができる:
len(path) - len(replace(path,'/',''))
その後、子供たちは両親より1つの多いの深さを持って、そして子供たちのパスが親パスで始まる:
on children.depth = parents.depth + 1
and substring(children.path, 1, len(parents.path)) = parents.path
SQL Server用に(一緒にこれを置くが、マイナーCHAでのPostgresで動作するはずですNGES):
;with depth as
(
select depth = case when path = '/' then 0
else len(path) - len(replace(path,'/',''))
end
, path
from YourTable
)
select COUNT(children.path) as child_count
, parents.path
from depth parents
left join
depth children
on children.depth = parents.depth + 1
and substring(children.path, 1, len(parents.path)) = parents.path
group by
parents.path
この版画:
child_count path
----------- --------------------
2 /
2 /a
0 /a/a
1 /a/b
0 /a/b/c
0 /b
テストデータ:私が編集している間に
if OBJECT_ID('YourTable') is not null
drop table YourTable
create table YourTable (child_count int, path varchar(max))
insert YourTable (path) values
('/'),
('/a'),
('/a/a'),
('/a/b'),
('/a/b/c'),
('/b')
私は答えとしてこれをPostgreSQLのように選択しました。 – user593996