いくつかの一般的な階層データに対していくつかの完全結合を行うクエリがあります。カテゴリにはグループがあり、グループにはアイテムがありますが、グループとアイテムはそれぞれカテゴリとグループに関連付けられていなくてもかまいません。SQL結果の階層的な番号付け
I. NULL
A. NULL
1. Item Orphan <-- no category or group
B. Group Red <-- no category
1. Item Apple
2. Item Banana
II. Category Bacon
A. Group Blue
B. Group Taupe
1. Item Kiwi
2. Item Watermelon
III. Category Atari
A. Group Silver
IV. Category Maui
...
注:私が好きな結果は次のようになり、私は例を読みやすくするための番号の後にピリオドを追加しましたが、出力は彼らを持つ必要はありません。
今の結果は次のようになります。
Category Group Item
NULL NULL Orphan
NULL Red Apple
NULL Red Banana
Bacon Blue NULL
Bacon Taupe Kiwi
Bacon Taupe Watermelon
Atari Silver NULL
Maui NULL NULL
そして、私は必要なのである:最後の行にA
と行のIo
列で1
S、けれども
Co Category Go Group Io Item
I NULL A NULL 1 Orphan
I NULL B Red 1 Apple
I NULL B Red 2 Banana
II Bacon A Blue 1 NULL
II Bacon B Taupe 1 Kiwi
II Bacon B Taupe 2 Watermelon
III Atari A Silver 1 NULL
IV Maui A NULL 1 NULL
NULL
の商品もあります。商品はNULL
です。しかし、孤児アイテム行のI
とA
は重要です。
edit:これは、わかりやすいように実際のコードから簡略化されています。私のケースでは、Itemは0個以上のSub-Itemsを持つことがあるので、Co
、Go
、およびIo
の値が単純に複製される各Itemに対して複数の行が存在する可能性があります。サブ項目には番号は付けられていないので、それらの序数の列はありません。だから、いくつかの完全な行の例は次のようになります。
Co Category Go Group Io Item Supplier Supplier_phone
I NULL B Red 2 Banana NULL NULL
II Bacon B Taupe 1 Kiwi Steve 555-1234
II Bacon B Taupe 1 Kiwi Sally 555-4242
II Bacon B Taupe 2 Watermelon NULL NULL
私の問題は2つあり:
- 私は、階層のレベルごとに異なる番号を行うと、それはいつでもそのレベルがインクリメント持っていますか変更?
- これらの数字を異なる序数のスペースに変換する(1,2,3をa、b、cまたはI、II、IIIに変換する)と、レベルごとに行う方法はありますか?
これはMS SQL Server 2012に含まれています。私はSQLにアクセスできるだけなので、T-SQLコードはありません。
参考のため、とWHERE
の句は、私がDRYを保ちたいコードの約20行です。以前はCTEを使っていましたが、この場合に役立つかどうかはわかりません。
私はrow_number over (order by...
を使用することに慣れていますが、私はこの場合どのように使用できるかわかりません。
階層に 'items'より低いレベルはありませんか? –
私は実際の使用事例から簡略化しましたが、はい、あります。それを反映するように質問を更新します。良いコール、これは大きな違いを生むかもしれない何かのような感じです。 – jinglesthula