View erfordert Interdependenzlogik: Ohne MODELL möglich?

Ich versuche, Oracle 11g SQL zu schreiben, stoße aber auf ein kleines Henne-Ei-Problem. Ich suche nach kalkulationstabellenähnlichem Verhalten. Ich habe eine Lösung gefunden, die Oracle @ verwendMODEL -Klausel, aber die Leistung ist nicht großartig. Also frage ich mich, ob ein "non-MODEL "Lösung ist sogar technisch machbar.

Hier ist ein Spielzeugbeispiel, das zeigt, was ich versuche zu tun. Angesichts dieser Tabelle:

CREATE TABLE t (id NUMBER PRIMARY KEY, n NUMBER);
INSERT INTO t (id, n) VALUES (2, 0);
INSERT INTO t (id, n) VALUES (3, 1);
INSERT INTO t (id, n) VALUES (5, 1);
INSERT INTO t (id, n) VALUES (7, 2);
INSERT INTO t (id, n) VALUES (11, 3);
INSERT INTO t (id, n) VALUES (13, 5);
INSERT INTO t (id, n) VALUES (17, 8);
INSERT INTO t (id, n) VALUES (19, 13);

Ich möchte zwei zusätzliche, abgeleitete Spalten berechnen und sie @ nenneX undY.

Hier sind die Regeln, wieX undY sind zu berechnen:

X: Legen Sie für die erste Zeile, wie durch den Mindestwert von ID definiert, @ fesX zuN. Für alle nachfolgenden Zeilen wird der Wert vonX sollte eins weniger sein als der Wert des vorherigenY, sortiert nachID.

Y: ZweimalN PlusX.

Diese nächsten Schritte zeigen, wie ich mein gewünschtes vi ausfüllen würde, wenn ich dies von Hand tun würde. Zuerst die ersten paar Zeilen der angegebenen Daten:

 ID    N    X    Y
---  ---  ---  ---
  2    0
  3    1
  5    1
  7    2
....

Da wir in der ersten Reihe sind,X sollte auf @ gesetzt werdN, oder0. Y sollte sein2 * N + X, oder0.

 ID    N    X    Y
---  ---  ---  ---
  2    0    0    0
  3    1
  5    1
  7    2
....

Now, da wir nicht mehr in der ersten Reihe sind,X sollte immer eins kleiner sein als das @ der vorherigen ZeiY von hier an raus. Hier in der zweiten Reihe bedeutet dasX = (vorherigesY) -1 = 0 - 1 = -1. Und die zweite Reihe istY wird sein2 * N + X, oder2 * (1) + (-1) = 1.

 ID    N    X    Y
---  ---  ---  ---
  2    0    0    0
  3    1   -1    1
  5    1
  7    2
....

Wenn Sie mit der Berechnung fortfahren, ist hier das gewünschte Ergebnis:

 ID    N    X    Y
---  ---  ---  ---
  2    0    0    0
  3    1   -1    1
  5    1    0    2
  7    2    1    5
 11    3    4   10
 13    5    9   19
 17    8   18   34
 19   13   33   59

Gegeben die Regeln für wieX undY berechnet werden, ist es möglich, dieses Ergebnis zu erhalten, ohne auf das @ zurückgreifen zu müssMODEL Klausel?

Ich suche keine mathematische Vereinfachung anhand dieses Beispiels. Dies ist nur ein Spielzeugbeispiel, das mir einfällt und die Art der gegenseitigen Abhängigkeit zeigt, mit der ich in meinem eigentlichen Problem konfrontiert bin.

P.S .: Hier ist einMODEL Beispiel Ich konnte zusammenschustern, was diese Ausgabe erzeugt. Vielleicht sind Modifikationen möglich, um die Leistung zu verbessern?

SQL> WITH u AS (
  2      SELECT ROW_NUMBER() OVER (ORDER BY t.id) r
  3      ,      t.id
  4      ,      t.n
  5      FROM   t
  6  )
  7  SELECT r
  8  ,      id
  9  ,      n
 10  ,      x
 11  ,      y
 12  FROM   u
 13  MODEL
 14      DIMENSION BY (r)
 15      MEASURES (id
 16      ,         n
 17      ,         CAST(NULL AS NUMBER) x
 18      ,         CAST(NULL AS NUMBER) y) RULES AUTOMATIC ORDER
 19    ( x[1] = n[cv()]
 20    , y[r] = 2 * n[cv()] + x[cv()]
 21    , x[r > 1] ORDER BY r = y[cv() - 1] - 1
 22      )
 23  ;

         R         ID          N          X          Y
---------- ---------- ---------- ---------- ----------
         1          2          0          0          0
         2          3          1         -1          1
         3          5          1          0          2
         4          7          2          1          5
         5         11          3          4         10
         6         13          5          9         19
         7         17          8         18         34
         8         19         13         33         59

8 rows selected.

SQL>

Vielen Dank

Antworten auf die Frage(2)

Ihre Antwort auf die Frage