Iterationsschritt im rekursiven SQL

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

Kurzfassung meiner Frage:
wie kann ich einen Iterationsschritt definieren, die bei jedem Schritt nach nächst größerer Zahl sucht. Also, statt i = i + 1 hätte ich gerne so etwas:
Code:
i = nächstGrößereZahl(i)

Komplettfassung meiner Frage:
ich habe erfolgreich meinen rekursiven SQL-Code ausgeführt. Unter anderem sieht der Join-Kriterum so aus:

Code:
WHERE
        AND ...
        AND ...    
        AND a.iterationColumn = b.iterationColumn + 1
        AND ...

Wie Ihr sehen könnt, die Iteration basiert auf der Formel + 1. Nun, ich hab festgestellt, es gibt "Daten-Lücken" in meiner Ausgangsspalte b.iterationColumn, sodass die Iteration mit + 1 nicht immer geht.

Idealfälle:
1 2 3 4 5 6 ... 100
1 2 3 4 5 6 ... 117
1 2 3 4 5 6 ... 218

Trouble-Fälle:
1 3 4 5 7 8 ... 109

Ich bin am Überlegen, mit welcher Iterationsbedingung bzw. Join-Bedingung ich obige Fälle abdecken kann. Also, statt + 1 muss ich eigentlich sowas nehmen:
"nehme die nächst größere Zahl. Und zwar nicht willkürlich, sondern wirklich die nächst kleinste größere Zahl"

Vom obigen Beispiel:
nach 1 soll 3 genommen werden, anstatt 4 oder 5.

Hat jemand vielleicht eine Idee? Danke..

Schöne Grüße aus Rheinland,

Eure Ratna
 
Ahoi Retna

arbeitest du mit Oracle? MySQL?

Von einem beliebigen Wert aus gesehen den nächsten verwendeten Wert ermitteln ist relativ einfach. Beispiel für den nächsten verwendeten Wert nach 5:
SQL:
SELECT 
	MIN(id)
FROM
	test
WHERE
	-- Hier der aktuelle Wert von dem man den nächst höheren haben will
	id > 5

Um zu sagen wie du das am besten in dein bestehendes SQL einbaust, müsste ich den Rest davon sehen
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw,

danke für die rasche Antwort. Vorweg ---> ich verwende DB2

Voller Hoffnung bin ich mit deiner Idee ans Werk gegangen. Aus irgendeinem Grund funktionierte der Code aber dann nicht mehr, obwohl von der Logik her eigentlich ziemlich gut aussieht.

Der gesamte Code sieht wie folgt aus:

Code:
rec (column_01, column_02, iterationColumn, column_04) as (
select 
        b.column_01,
        b.column_02,
        0 as iterationColumn,
        b.column_04
from 
    base b
union all
    select
        r.column_01,
        r.column_02,
        b.iterationColumn,
        r.column_04
    from
        rec r,
        mySchema.table b
    where
        r.column_01 = b.column_01 
        and r.column_02 = b.column_02    
        and r.iterationColumn = b.iterationColumn + 1
        and r.column_04 <= r.column_04
)

Wie man im Quellcode sieht, ist die Iterationsdefintion ja nur ganz schlicht, einfach + 1
Yaslaw schlug mir dann folgende Formel vor:

Code:
AND MIN(R.ITERATIONCOLUMN) > B.ITERATIONCOLUMN

Aus irgendeinem Grund funktioniert aber der Code nicht mehr. Folgende Fehlermeldung wurde rausgespuckt:

Code:
Invalid use of an aggregate function or OLAP function.. SQLCODE=-120, SQLSTATE=42903

Ich hoffe, die Hoffnung besteht weiterhin. :(

Vielen Dank Yaslaw.

Schöne Grüße aus Rheinland,
Eure Ratna
 
item: Ich habe ide Formel nicht so wie du es umgesetzt hast vorgeschagen..

item: Ich kenne DB2 nicht.
Aber, was ist rec? Oben definiert sich rec als die Ausgabe vom SELECT und innerhalb des SELECT greifst du wieser auf rec zu.

item: MIN ist eine Gruppierungsfunktion (egal welche Art von SQL) und kann eigentlich immer nur in Verbindung mit einem GROUP BY verwendet werden. In meinem Fall konnte ich den GROUP BY bei MySQL weglassen, da keine anderen Felder involviert sind

item: Kennt DB2 Subqueries?
Wenn ja, würde ich sowas vorschlagen:
SQL:
        and r.iterationColumn = (SELECT MIN(r1.iterationColumn) FROM rec r1 WHERE r1.iterationColumn > b.iterationColumn)
 
Zuletzt bearbeitet von einem Moderator:
sorry sorry, mein letzter Beitrag war nicht böse gemeint oder so, falls der eine oder andere falsch interpretiert hat. Ich bezweifle keineswegs Eure Kompetenz. Dass ich die Idee von Yaslaw als Vorschlag wahrgenommen habe, bin ich selbst schuld. Sorry, ich denke nicht so zwischen den Zeilen.
 
sorry sorry, mein letzter Beitrag war nicht böse gemeint oder so, falls der eine oder andere falsch interpretiert hat. Ich bezweifle keineswegs Eure Kompetenz. Dass ich die Idee von Yaslaw als Vorschlag wahrgenommen habe, bin ich selbst schuld. Sorry, ich denke nicht so zwischen den Zeilen.
Keine Angst. Ich auch nicht. Ich wollte nur richtig stellen, dass meine Idee anderst gemeint war.

Aber wie sieht es mit den Subqueries in DB2 aus?
 
Hallo Yaslaw,

ja, ich hab nochmal probiert mit dem Subquery:

Code:
r.iterationColumn  < (SELECT MIN(r1.iterationColumn) 
        	                       FROM 
        	                               rec r, 
        	                               meinSchema.meineTabelle r1 
        	                       WHERE 
                                               r.Column_01 = r1.Column_01 
        	                               and r.Column_02 = r1.Column_02)

Also, das Ergebnis von dem Subquery spuckt mir schon mal die kleinste Zahl aus der Spalte iterationColumn. Das ist ja schon mal gut. Wenn also zum Beispiel die kleinste Zahl eine 2 ist, dann muss ich dies irgendwie als Iterationsergebnis in meine Rekursionsbedingung bringen. Also, r.iterationColumn hat immer den Anfangswert 0

Wenn ich so mache:
Code:
0 < 2
, dann würde ja noch angenommen, aber r.iterationColumn wird ja in dem Fall nicht verändert, stattdessen bleibt er weiterhin 0. Das ist nicht gut.

Och Gott, ich glaube, das wird jetzt unübersichtlich.

Hoffentlich habt Ihr noch die eine oder andere Idee.

Schöne Grüße aus Rheinland,
Eure Ratna:p
 
Hallo zusammen,

ich habe mich entschieden zur Lösung des Problems einen anderen Weg zu gehen:

Name iterationColumn rangSpalte

ratna 1 1
ratna 2 2
ratna 4 3
ratna 6 4
yaslaw 1 1
yaslaw 2 2
yaslaw 3 3
... ... ...
... ... ...
... ... ...

Dazu hab ich eine OLAP-Funktion benutzt, leider nicht allzu erfolgreich, da der Rank ja pro Namen gehen sollte. Mein fehlerhafter Code bisher:

Code:
SELECT RANK() OVER(ORDER BY iterationColumn) as rangSpalte 
      FROM mySchema.myTable

Weiss jemand, wie ich hier den Code erweitern soll, damit der Rang nach einzelnen Namen soll?

Vielen Dank.

Schöne Grüße aus Rheinland,
Eure Ratna db2
 
Zurück