3

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

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

例如:

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。

编辑: 尼古拉和戈登的解决方案都运作良好,虽然我认为尼古拉的稍微快一点!谢谢你们!

必须对 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
4

2 回答 2

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
于 2012-05-08T15:03:29.350 回答
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
于 2012-05-08T15:14:05.573 回答