SQL Abfrage gesucht

Hallo,

ich bräuchte Hilfe bei der Erstellung einer SQL Select Abfrage.

Anforderung:
Ermittlung aller Klassen zu einer Klassengruppe

vorhandene Tabellen:
sysclass (ID, Name) (alle Klassen)
sysclassgroup (ID, Name) (alle Klassengruppen)
sysclassgroupcontent (GroupID, ContentID, ContentType) (Verbindungstabelle)

In der Tabelle sysclassgroupcontent ist der Aufbau einer Klassengruppe hinterlegt. D.h.
sysclassgroupcontent.groupid = sysclassgroup.id
sysclassgroupcontent.contentid = sysclassgroup.id (wenn sysclassgroupcontent.contenttype = 2) ODER
sysclassgroupcontent.contentid = sysclass.id (wenn sysclassgroupcontent.contenttype = 0)

Die Schwierigkeit ist, dass in einer Klassengruppe neben Klassen auch mehrere weitere Klassengruppen sein können, welche wiederum weitere Klassen und Klassengruppen haben können.

Ich komm hier irgendwie nicht weiter, vielleicht hat einer von euch einen Tip.

Danke im Voraus.

Gruß
Sebastian

rekursive SQL

vielleicht hilft das weiter
http://www.mayeruli.de/db2/rekursives-sql.html

…danke, das hilft schon sehr viel weiter. Nach einem ersten Test, sieht es auch sehr gut aus, ich laufe nur momentan auf den Fehler:
ORA-32044: Cycle bei der Ausführung der rekursiven WITH-Abfrage ermittelt
…muss glaube ich noch ein Feintuning machen.

Hier mein Script:
WITH abcde ( groupid , contentid, stufe ) AS – feste Syntax für Common table expression, Spaltenliste lt. Frage 1
( SELECT groupid, contentid, 1 as stufe FROM sysclassgroupcontent WHERE groupid = 30001 – Basisselect lt. Frage 2
UNION ALL – feste Syntax für Rekursion
SELECT A.groupid , A.contentid, b.stufe+1 FROM sysclassgroupcontent A – Spaltenliste (wie gehabt lt. Frage 1)
INNER JOIN ABCDE B ON A.groupid = B.contentid WHERE B.STUFE

Halo Urkel,

ORA-32044: Cycle bei der Ausführung der rekursiven
…muss glaube ich noch ein Feintuning machen.

ohne den SQL oder die Tabellen zu kennen: das ist kein SQL-Problem, sondern eher ein Fehler in den Daten. Du hast irgendwo zyklische Referenzen (sprich: ein Urururenkel deines Vaterknotens ist als selbst wieder als dessen Vater eingetragen oder so…)

Prüf besser mal deine Daten.

gruss
b.

Hallo,
das kann mit Sicherheit vorkommen, kann man das in der Abfrage irgendwie abfangen?
Die Daten zu kontrollieren ist nicht so einfach möglich.
Danke

Ich habe die Lösung gefunden.
Hier das Skript:
select distinct a.contentid, b.name from
(WITH abcde ( groupid , contentid, contenttype, stufe, path ) AS
( SELECT groupid, contentid, contenttype, 1 as stufe, ‚/‘ || groupid path FROM sysclassgroupcontent WHERE groupid = 30001 – GruppenID festlegen
UNION ALL
SELECT A.groupid , A.contentid, a.contenttype, b.stufe+1, path||’/’||a.groupid path FROM sysclassgroupcontent A
INNER JOIN ABCDE B ON A.groupid = B.contentid and b.contenttype = 2)
cycle contentid set is_cycle to ‚1‘ default ‚0‘
SELECT * FROM ABCDE) a,
sysclass b
where a.contenttype = 0 and a.contentid = b.id
order by a.contentid;

durch die Einfügung der Cycle Funktion habe ich das Ergebnis bekommen.
Danke noch mal

1 Like

das mal echt fein von dir :smile:

kannst du eben nochmal dein
SQL system nennen ?