Verweis auf übergeordnete Spalten in Oracle CONNECT BY hierarchische Abfrage

Ich habe Daten, die wie folgt aussieht:

KEY1   KEY2      KEY3   LKEY1  LKEY2     LKEY3  FLAG
====== ========= ====== ====== ========= ====== =====
09/10  10000     A1234  09/10  AU000123  A1234  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

Dies ist hierarchische Daten, wobei ich würde die Abfrage gegen die Wurzel zusammengesetzten Schlüssel (in diesem Fall 09/10 10000 A1234); die FLAG Feld bezieht sich auf das 'Objekt', identifiziert durch die LKEYx Tasten. Es kann eine beliebige Anzahl von Ebenen verschachteln. (Beachten Sie, dass die KEY1 und KEY3 Felder müssen nicht sein-Invarianten, wie in dem Beispiel oben, solange die Hierarchie gewahrt wird.)

Was ich abrufen möchten, sind die leaf-Knoten, aber wenn ein Blatt übergeordnete KEY2 ist die gleiche Länge wie LKEY2 oder enthält eine X als zweiten Buchstaben, dann den unmittelbar übergeordneten. In diesem Fall müssen wir auch die Markierung des Datensatzes als optionale... So etwas wie dieses:

KEY1   KEY2      KEY3   OPTION  FLAG
====== ========= ====== ======= =====
09/10  AU000123  A1234  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

Ich geschrieben habe eine Abfrage, die dies tut, aber es ist nicht schön. Darüber hinaus macht es die Annahme, dass alle Blattknoten sind auf der gleichen Ebene der Baumstruktur, um zu unterscheiden, dass die optionale Datensätze werden; dies ist jedoch nicht unbedingt wahr. Meine Abfrage lautet wie folgt:

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');

Den Grund für queryKeys wird verwendet, da Sie anderswo in einer größeren Abfrage und kann mehr als einen Datensatz. Die maxTree Teil ist das problem, über seine Allgemeine Schrulligkeit!

Nun, der Grund für den Titel von diesem post ist da diese Abfrage gemacht werden konnte viel einfacher, wenn ich könnte finden, um die Eltern FLAG Feld. Ich habe versucht, ein JOIN Annäherung zu dieser Idee ist-joining Baum mit sich auf die jeweiligen Tasten -- aber, wenn ich mich nicht Irre, wäre das Ergebnis in einem rekursiven problem, wo würde Sie immer wieder zu Durchlaufen, bis der Baum zu finden, den richtigen übergeordneten Schlüssel (sowohl die KEYx und LKEYx Felder definieren Sie die vollständigen zusammengesetzten Schlüssel für den Datensatz).

(P. S. Mit Oracle 10gR2, ob es einen Unterschied macht.)

InformationsquelleAutor Xophmeister | 2012-04-30
Schreibe einen Kommentar