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 に答える