0

テーブル名はカテゴリです。

CategoryId      ParentId        Name
1               NULL            StackOverFlow-1
2               1               StackOverFlow-2
3               1               StackOverFlow-3
4               2               StackOverFlow-4  
5               4               StackOverFlow-5

StackOverFlow-5 の親は StackOverFlow-4 です。

StackOverFlow-4 の親は StackOverFlow-2 です。

StackOverFlow-2 の親は StackOverFlow-1 です。

以下のような関数を作りたいです。

GetAllCategoryIdsUntilBaseParentByCategoryId(int Id)
{
    //..
}

再帰関数であるべきだと思います。ではない?

疑似コード:

int x -> Select ParentId From Category Where Id = 5
int y -> Select ParentId From Category Where Id = x
int z -> Select ParentId From Category Where Id = y

このモデルは続ける必要がありwhere ParentId is nullます..

どうすればいいですか?

4

1 に答える 1

0

SQL Server 2008 では、エレガントな単一の CTE クエリでこれを行うことができます。

スキーマを次のように単純化します。

create table t (id int, parent_id int, c char(1));

insert into t values 
( 1, Null, 'A'),
  ( 2, 1, 'B'),
  ( 3, 1, 'C'),
     (4, 3, 'D' ),
  ( 5, 1, 'E' );

クエリは次のようになります。

;with cte as (
  select *, id as node 
  from t 
  union all
  select t.*, cte.node
  from t inner join cte 
     on t.id = cte.parent_id
)
select * 
from cte
where node = 4;

結果

| ID | PARENT_ID | C | NODE |
-----------------------------
|  1 |    (null) | A |    4 |
|  3 |         1 | C |    4 |
|  4 |         3 | D |    4 |

ご覧のとおり、再帰はクエリにあります。これにより、複数のクエリとデータベースへの呼び出しが生成されなくなります。

于 2012-12-16T08:30:23.043 に答える