Anzeige:
Ergebnis 1 bis 10 von 10

Thema: SQL: Baumstruktur-Tabelle

  1. #1
    Registrierter Benutzer
    Registriert seit
    05.06.2003
    Beiträge
    118

    SQL: Baumstruktur-Tabelle

    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

  2. #2
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Ja, das geht. Nennt sich eine rekursive Abfrage. Ein Beispiel habe ich unter
    http://www.is.informatik.uni-duisbur...al/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.
    Das Ziel ist das Ziel.

  3. #3
    Registrierter Benutzer
    Registriert seit
    27.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von Thomas Engelke Beitrag anzeigen
    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

  4. #4
    Registrierter Benutzer
    Registriert seit
    05.06.2003
    Beiträge
    118
    Zitat Zitat von Jasper Beitrag anzeigen
    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

  5. #5
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    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

    Code:
    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.
    Geändert von Waxolunist (11-12-2006 um 13:00 Uhr)
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

  6. #6
    Registrierter Benutzer
    Registriert seit
    27.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von Thomas Engelke Beitrag anzeigen
    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    05.06.2003
    Beiträge
    118
    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

  8. #8
    Registrierter Benutzer
    Registriert seit
    02.11.2005
    Beiträge
    16
    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

  9. #9
    Registrierter Benutzer
    Registriert seit
    27.12.2002
    Ort
    Matrix
    Beiträge
    194
    Zitat Zitat von Thomas Engelke Beitrag anzeigen
    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

  10. #10
    Registrierter Benutzer Avatar von Waxolunist
    Registriert seit
    19.06.2006
    Ort
    Wien
    Beiträge
    485
    Zitat Zitat von paule Beitrag anzeigen
    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
    Das ist ein sehr guter Link. Danke, werde ich mir gleich zu meinen Favoriten hinzufügen.
    Spezialitäten heute: PLSQL, TSQL, Java (alles mit Webanwendungen), Groovy, Grails, ASP.NET, Javascript, Python, Django
    Straight through, ohne Umwege ans Ziel

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •