私はこのようになり、データがあります:私は(この場合09/10 10000 A1234
で)ルート複合キーに対してクエリを実行されるだろうとなる参考
KEY1 KEY2 KEY3 LKEY1 LKEY2 LKEY3 FLAG
====== ========= ====== ====== ========= ====== =====
09/10 10000 A1234 09/10 AU00A1234 1
09/10 10000 A1234 09/10 AU000456 A1234 1
09/10 10000 A1234 09/10 AX000001 A1234 1
09/10 AX000001 A1234 09/10 AE000010 A1234 0
09/10 AX000001 A1234 09/10 AE000020 A1234 0
09/10 AX000001 A1234 09/10 AE000030 A1234 0
09/10 10000 A1234 09/10 AX000002 A1234 0
09/10 AX000002 A1234 09/10 AE000040 A1234 0
09/10 10000 A1234 09/10 AU000789 A1234 0
これは、階層的なデータです。 FLAG
フィールドはLKEYx
キーで識別される「オブジェクト」を参照します。ネストのレベルはいくつでもかまいません。 (KEY1
とKEY3
フィールドは限り階層が保存されているように、上記の例のように、不変である必要はないことに注意してください。)私が取得したい何
がリーフノードで、しかし葉の親であればKEY2
の長さはLKEY2
と同じか、または2番目の文字としてX
が含まれている場合は、直接の親を返します。この場合、我々はまた、このような何か...オプションとして、レコードをマークする必要がありそう:
KEY1 KEY2 KEY3 OPTION FLAG
====== ========= ====== ======= =====
09/10 AU00A1234 0 1
09/10 AU000456 A1234 0 1
09/10 AX000001 A1234 1 1
09/10 AX000002 A1234 1 0
09/10 AU000789 A1234 0 0
を私はこれを行うクエリを書かれているが、それはかなりありません。さらに、オプションのレコードを区別するために、すべてのリーフノードがツリーの下の同じレベルにあると仮定します。しかしながら、これは必ずしも真実ではない。次のように私のクエリは次のとおりです。
with queryKeys as (
select '09/10' key1,
'10000' key2,
'A1234' key3,
from dual
),
subTree as (
select tree.key1,
tree.key2,
tree.key3,
tree.lkey1,
tree.lkey2,
tree.lkey3,
tree.flag,
connect_by_isleaf isLeaf,
level thisLevel
from tree,
queryKeys
start with tree.key1 = queryKeys.key1
and tree.key2 = queryKeys.key2
and tree.key3 = queryKeys.key3
connect by tree.key1 = prior tree.lkey1
and tree.key2 = prior tree.lkey2
and tree.key3 = prior tree.lkey3
),
maxTree as (
select max(thisLevel) maxLevel
from subTree
)
select lkey1 key1,
lkey2 key2,
lkey3 key3,
1 - isLeaf option,
flag
from subTree,
maxTree
where (isLeaf = 1 or thisLevel = maxLevel - 1)
and (length(key2) != length(lkey2) or substr(lkey2, 2, 1) != 'X');
queryKeys
の理由は、それが大きなクエリ内の他の場所で使用しているためで、一つのレコードよりも多くを含めることができます。 maxTree
の部分は、その一般的な奇妙さを超えて、問題です!
この投稿のタイトルは、親のFLAG
フィールドを参照できる場合はより多くの場合、このクエリを多く作成することができるためです。私はJOIN
というアプローチを試しました - ツリーを関連するキーで自分自身に結びつけました - 私が間違っていない限り、ツリーを繰り返してツリーを見つけ出す必要がある再帰的な問題が発生します正しい親キー(KEYx
フィールドとLKEYx
フィールドの両方がレコードの完全な複合キーを定義しているため)。
(PSそれが違いを行う場合は、Oracle 10gリリース2を使用した。)
美しい!ありがとうございました :) – Xophmeister