递归SQL选择

时间:2012-11-01 21:59:44

标签: mysql sql hierarchical-data

我有类别的项目,这些类别也可以有类别如何找到第一个父类。例如......

CategoriesTbl
CategoryId | CategoryName   | parent
-------------------------------------
1          | Category1      | 0
2          | Category2      | 1
3          | Category3      | 2

ItemsTbl
ItemId     | CategoryId
-------------------------------------
1          | 3

如何对项目执行选择并将其连接到具有父类别(CategoryId = 1)的类别表。父类别可以无限深嵌套。

2 个答案:

答案 0 :(得分:2)

MySQL不支持递归SQL查询。但是还有其他方法可以存储这样的父子数据,这些数据允许您使用单个SQL查询来获取整个树。

另见:

答案 1 :(得分:0)

你可以使用这样的东西作为起点。

例如,

Rank chid parid

7 6

5 4

4 3

3 2

2 Null

我的输出应该是

排名chiid parid

1 5 4

2 4 3

3 3 2

4 2 Null

CODE SNIPPET:

declare @table table(child int, parid int)
insert into @table
select 7, 6 union all
select 5, 4 union all
select 4, 3 union all
select 3, 2 union all
select 2, null

;with list
( tLevel,
  child,
  parId
) as
( select
  1 as tLevel,
  child,
  parId
  from @table a
  where parId is null
  union all
  select
  tLevel + 1,
  b.child,
  b.parId
  from list a
  join @table b
   on b.parId = a.child
)
select
  rank() over(order by tLevel desc)
    as Rank,
  child,
  parId
from list



/* -------- Sample Output: --------
Rank                 child       parId
-------------------- ----------- -----------
1                    5           4
2                    4           3
3                    3           2
4                    2           NULL
*/