SQL 2003より前のSQL(つまりSQL Server 2000)の再帰は多少醜いです。ツリー内の各レベルについて、元のテーブルに別の結合ステートメントを書き戻す必要があります。階層のレベル数が固定されていれば、このようなことを書くことができます。
create table #Hell (
parent int,
id int,
name varchar(30)
)
insert into #Hell values (NULL, 1, 'The Boss')
insert into #Hell values (1, 2, 'The Boss'' PA')
insert into #Hell values (1, 3, 'Production Director')
insert into #Hell values (3, 4, 'Jim''l Fixit')
select * from #Hell H1
inner join #Hell H2
ON H1.id=H2.parent
inner join #Hell H3
ON H2.id=H3.parent
WHERE H3.Id=4 --Find the boss for Jim
drop table #Hell
幸いにもSQL Server 2005では、再帰的な操作が非常に簡単に書き込むことができますと共通テーブル式を持っています。参照参照http://www.4guysfromrolla.com/webtech/071906-1.shtml
また、データベース内のツリーを表すさまざまな方法にも注意する必要があります。このプレゼンテーションからSQLのツリー上のスライドを見てくださいhttp://www.slideshare.net/billkarwin/sql-antipatterns-strike-back
出典
2009-08-03 14:45:18
pjp
"with"演算子は実際には "共通テーブル式"(CTE)と呼ばれ、SQL Server固有の拡張ではありませんが、SQL:2003標準の一部です。 –
私はそれがMicrosoftのことだと思って何らかの理由で感謝しますが、PostgresはWITH RECURSIVEを使ってCTEをサポートしています。 – pjp