我有一个数据表,其中包含技术上是树结构的数据,但树是由代码和此代码的长度定义的。
商品代码表由代码和描述组成:
例如:
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
答案 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