BearT: Subselects abhängig vom übergeordneten Select Statement?

Hallo,

ich würde gerne wissen, ob es möglich ist ein SQL Statement rekursiv mit dem Ergebnis eines übergeordneten Selects aufzurufen.

Konkret geht es darum, dass ich in einer Tabelle 'ITEMS' beliebige Items speichere, die sowohl Eltern als auch Kinder haben können. Mein Ziel ist es nun zu einem beliebigen Item alle Kinder, egal in welcher Rekursionstiefe, zu finden.

Im Moment arbeite ich mit folgendem Select-Statement, dass allerdings nur die Kinder und Enkel (jedoch nicht tiefer) von Item 6 überprüft:

<code>
SELECT * FROM ITEMS WHERE PARENTITEM IN (SELECT ID FROM ITEMS WHERE PARENTITEM = 6) OR PARENTITEM = 6
</code>

  1. ich würde gerne wissen, ob es möglich ist ein SQL Statement rekursiv mit dem Ergebnis eines übergeordneten Selects aufzurufen.

    M.W. nach nicht.

    Moeglicherweise bietet Dein SQL-Dialekt aber bestimmte Anweisungen, die so genannte Programmflusskontrollsprache. Hier koenntest Du die Anforderung bspw. in einer stored procedure und einer WHILE-Schleife halbwegs angemessen bearbeiten.

    Nicht schlecht auch die Idee den zu analysierenden Datenbestand in PHP oder so weiterzuverarbeiten.

  2. echo $begrüßung;

    ich würde gerne wissen, ob es möglich ist ein SQL Statement rekursiv mit dem Ergebnis eines übergeordneten Selects aufzurufen.

    Nein, das geht nur mit mehrfachen Abfragen von "außerhalb" oder mit einer selbst zu schreibenden Routine (Stored Procedure) innerhalb des DBMS. Nicht alle DBMS bzw. alle Versionen davon bieten SP an. Rekursive Abfragen an die DB zu senden ist jedoch nicht besonders gut. Jedes Mal fällt dabei der gesamte abzuarbeitende Overhead einer Abfrage an.

    Konkret geht es darum, dass ich in einer Tabelle 'ITEMS' beliebige Items speichere, die sowohl Eltern als auch Kinder haben können. Mein Ziel ist es nun zu einem beliebigen Item alle Kinder, egal in welcher Rekursionstiefe, zu finden.

    Vielleicht kommst du besser, wenn du ein Nested Set[*] verwendest. Dieses ist zwar aufwendiger zu pflegen, bieten aber viele Möglichkeiten, mit einer Abfrage den gewünschten Teil der Baum-Struktur zu erhalten. Es spielt seinen Vorteil dann aus, wenn die Daten selten geändert aber häufig abgefragt werden.

    Weder die Speicherung als Eltern-Kind-Beziehung noch die als Nested Set liefert die Daten als Baumstruktur zurück. Diese müsstest du in beiden Fällen in deiner abfragenden Umgebung erzeugen. Eine Möglichkeit, diesem Aufwand zu entgehen, wäre ein "Serialized LOB" (LOB = Large Object). Man speichert dabei einfach eine serialisierte Form der Datenstruktur. Unter PHP würde man das verschachtelte Array mit serialize() in einen String verwandeln und diesen dann in der DB oder einer anderen Datenhaltung ablegen. Das Wiederherstellen geht dann mit unserialize(). Die Datenstruktur kann man dann natürlich nicht mehr durch Ändern von Datensätzen in der Datenbank beeinflussen, sondern nur noch innerhalb der abfragenden Umgebung.

    [*] siehe Wikipedia-Artikel Nested Set und die dortigen weiterführenden Links

    echo "$verabschiedung $name";