PDA

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.

Jasper
08-12-2006, 19:08
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.

Jasper
11-12-2006, 18:23
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

paule
12-12-2006, 11:33
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)

Jasper
12-12-2006, 18:34
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.