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 回答