根据SQL中的代码计算树级别

时间:2012-05-08 14:35:39

标签: sql

我有一个数据表,其中包含技术上是树结构的数据,但树是由代码和此代码的长度定义的。

商品代码表由代码和描述组成:

例如:

Code    Description
------  -------------
0101    Live Animals
01011   Horses
010110  Purebred
010190  Other

项目的级别是通过计算其下方的代码来计算的。它下面的代码必须包含在当前代码中。如果这是有道理的。

所以在上面的例子中:

0101   is level 0 (nothing is contained in it)
01011  is level 1 (0101 is contained in it)
010110 is level 2 (0101 and 01011 is contained in it)
010190 is level 1 (only 0101 is contained in it)

有没有办法在SQL中获得这些级别?我正在使用DB2。

修改: Nikola和Gordon的解决方案都运行良好,但我认为Nikola的速度稍快一些!谢谢你们!

不得不做一些编辑来解释DB2:

select
    t1.code, count(t2.code)
from commoditycode t1 
left join commoditycode t2
on substr(t1.code, 1, length(t1.code) - 1) like concat(t2.code, '%')
group by t1.code

2 个答案:

答案 0 :(得分:4)

在代码减去最后一个字符时加入自身会在右侧找到所有父母。计算它们将得到项目的级别:

declare @test table (code varchar(10), name varchar(100))

insert into @test values ('0101', 'Live Animals')
insert into @test values ('01011', 'Horses')
insert into @test values ('010110', 'Purebred')
insert into @test values ('010190', 'Other')

select t1.code, t1.name, count (t2.code) + 1 [level]
  from @test t1
  left join @test t2
    on substring (t1.code, 1, len (t1.code) - 1) like t2.code + '%'
 group by t1.code, t1.name


code    name            level
01011   Horses          2
0101    Live Animals    1
010190  Other           2
010110  Purebred        3

答案 1 :(得分:4)

有趣的问题。如果我理解正确,可以使用标准SQL解决这个问题。

这是个主意。对于每个代码,我想将其与所有其他代码进行比较。我只关心第一个代码的开头与其他代码匹配的其他代码。

有了这个,我只计算这些代码的数量:

select code, description, count(*) as level
from 
(
  select c.code, c.description, c2.code as abovecode
  from commmodity c 
  left outer join commodity c2 on
    on left(c.code, len(c2.code)) = c2.code 
    and c.code <> c2.code
  group by c.code, c2.code
) c
group by code, description