Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL: Baumstruktur-Tabelle
Thomas Engelke
08-12-2006, 13:56
Hallo!
Ich habe hier eine selbstreferenzierende Tabelle, also die Tabelle enthält im Datensatz eine Referenz auf einen anderen Datensatz derselben Tabelle.
Die Datensätze sollen nach bestimmten Kriterien gefiltert werden. Bei der Erzeugung der Abfrage steht die Verschachtelungstiefe des Baumes nicht fest.
Lassen sich solche Abfragen in einer einzigen Abfrage abhandeln, also ohne iterative Verarbeitung in der Programmiersprache dahinter?
Danke,
Thomas
mwanaheri
08-12-2006, 17:14
Ja, das geht. Nennt sich eine rekursive Abfrage. Ein Beispiel habe ich unter
www.is.informatik.uni-duisburg.de/courses/dbp_ss05/material/woche07.pdf
gefunden:
WITH rek (stueck, komponente, menge) AS (
SELECT r.stueck, r.kompenente, r.menge
FROM bauteile r
WHERE r.stueck = ’Beispiel-Bauteil’
UNION ALL
SELECT kind.stueck, kind.komponente, kind.menge
FROM rek vater,
bauteile kind
WHERE vater.komponente = kind.stueck
)
SELECT DISTINCT stueck, komponente, menge
FROM rek
ORDER BY stueck, komponente, menge
Wie es genau funktioniert und ob dein dbms damit klar kommt, hängt natürlich vom dbms ab.
Lassen sich solche Abfragen in einer einzigen Abfrage abhandeln, also ohne iterative Verarbeitung in der Programmiersprache dahinter?
hängt vom DBMS ab, Oracle verwendet dazu 'CONNECT BY' um die hierarchie zu definieren.
-j
Thomas Engelke
11-12-2006, 09:52
hängt vom DBMS ab, Oracle verwendet dazu 'CONNECT BY' um die hierarchie zu definieren.
Jau, aber wichtig war hier, dies unabhängig vom RDBMS zu definieren. CONNECT war uns als gutes Beispiel für Oracle geläufig.
Wir gehen also davon aus, daß es keine Standardfunktion für dieses Problem gibt und man auf die herstellerspezifischen Lösungen angewiesen ist?
TME
Waxolunist
11-12-2006, 11:26
Hallo
Ich weiß nicht genau was du genau möchtest.
Könntest du da ein Beispiel geben.
Ich habs ungefähr so verstanden:
Ich hab also folgende Tabelle:
TESTID PARENTID
---------------------- ----------------------
1 -1
2 1
3 2
4 3
5 -1
6 5
7 6
PARENTID=-1: kein Vorgänger
Da würde ich mit einer einfachen SQL-Abfrage beginnen welche dann folgende Ausgabe liefert:
TESTID PARENTID
---------------------- ----------------------
1 -1
2 1
3 2
4 3
select * from testtable t1
START WITH t1.testid=1 CONNECT BY prior t1.testid = t1.parentid order by t1.testid;
Also ungefähr: Zeig mir alle Datensätze der Kette ab der testid 1.
Ich weiß aber nicht, in welchen DBs dass funktioniert. Bin eben Oracle verwöhnt.
mfg, christian
PS: Sry, habe gerade gesehen, dass ihr das ja alles schon wußtet, hab mir den Thread nicht allzu genau durchgelesen. Also Oracle kommt wohl nicht in Frage. Noch mal Sry für meinen dummen Post.
Jau, aber wichtig war hier, dies unabhängig vom RDBMS zu definieren. CONNECT war uns als gutes Beispiel für Oracle geläufig.
naja, hast nichts zu dem DBMS gesagt.
Wir gehen also davon aus, daß es keine Standardfunktion für dieses Problem gibt und man auf die herstellerspezifischen Lösungen angewiesen ist?
prinzipiell gehen hierarchische abfragen mit standard-sql, aber nicht für unlimitierte tiefe.
direkte parent-child- oder child-parent-bezieungen lassen sich aber durchaus abbilden.
gib einfach ein beispiel, was genau gefordert wird.
-j
Thomas Engelke
12-12-2006, 09:26
Beispiel:
tblBudget(intBudget,strBudgetname,intChild,logMerk mal)
intChild referenziert tblBudget.intBudget
Es muß soweit die Hierarchie abgebildet werden, das fest steht, wie das Merkmal "logMerkmal" in der untersten Budgetebene steht (wo also tblBudget.intChild NULL ist).
Wir suchen nach einer RDBMS-unabhängigen Lösung, dies in einer einzelnen Abfrage auszudrücken.
TME
Es gibt eine Möglichkeit, Bäume als Nested Sets in SQL darzustellen (unabhängig vom DBMS). Dann kannst du mit einer Abfrage auf einen Teilbaum zugreifen. Etwas aufwendiger sind Inserts, aber vielleicht ist das ja etwas für dich.
Gruß,
Paul
[1] Bäume mit SQL (http://www.develnet.org/36.html)
Wir suchen nach einer RDBMS-unabhängigen Lösung, dies in einer einzelnen Abfrage auszudrücken.
ich nehme mit einem beliebigen intBudget als startwert, daraus resultiert eine unbekannte hierarchietiefe. da kenne ich keine lösung mit einem einzigen statement.
-j
Waxolunist
13-12-2006, 09:19
Es gibt eine Möglichkeit, Bäume als Nested Sets in SQL darzustellen (unabhängig vom DBMS). Dann kannst du mit einer Abfrage auf einen Teilbaum zugreifen. Etwas aufwendiger sind Inserts, aber vielleicht ist das ja etwas für dich.
Gruß,
Paul
[1] Bäume mit SQL (http://www.develnet.org/36.html)
Das ist ein sehr guter Link. Danke, werde ich mir gleich zu meinen Favoriten hinzufügen.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.