Durchsuchen baumartiger Daten in einer relationalen Datenbank mit SQL

16

Gibt es eine Möglichkeit, Baumdaten in SQL zu durchlaufen? Ich kenne connect byOracle, aber gibt es eine andere Möglichkeit, dies in anderen SQL-Implementierungen zu tun? Ich frage, weil die Verwendung connect byeinfacher ist als das Schreiben einer Schleife oder einer rekursiven Funktion, um die Abfrage für jedes Ergebnis auszuführen.

Da einige Leute durch den Ausdruck "Baumdaten" verwirrt zu sein scheinen, werde ich weiter erläutern: Was ich meine, bezieht sich auf Tabellen, die ein parent_idoder ein ähnliches Feld haben, das einen Primärschlüssel aus einer anderen Zeile in derselben Tabelle enthält.

Die Frage stammt aus einer Erfahrung, in der ich mit Daten gearbeitet habe, die auf diese Weise in einer Oracle-Datenbank gespeichert wurden, und wusste, dass die connect byin anderen DBMS nicht implementiert sind. Wenn man Standard-SQL verwenden würde, müsste man einen neuen Tabellenalias für jedes übergeordnete Element erstellen, das aufgerüstet werden soll. Dies könnte leicht außer Kontrolle geraten.

indyK1ng
quelle
Sie haben Joe Celkos Lösungen. Einige Beispiele: Bäume in SQL , Bäume und Hierarchien in Oracle , Modell mit verschachtelten Mengen . Syntaxzucker ist nicht erforderlich ;-).
Marian

Antworten:

14

Celkos Buch ist eine gute Ressource - wenn auch manchmal etwas "akademisch".

Ich habe auch wirklich festgestellt, dass diese Methode , die als "Abschlusstabellen" bezeichnet wird, ziemlich gut funktioniert.

Wenn Sie eine Datenbank verwenden, die rekursive CTEs ermöglicht (z. B. PostgreSQL 8.4 oder höher oder SQL Server 2005 oder höher ), sind sie der beste Weg. Wenn Sie auf Oracle sind, gibt es immer die ehrwürdigen "Connect By" .

Nach meiner Erfahrung ist es weitaus üblicher, eine Reihe von Tabellen in einem "naiven Baum" -Schema zu erhalten und herauszufinden, wie der richtige Baum aus diesem Speicher extrahiert werden kann, als die Möglichkeit zu haben, den Cleaner zu erstellen "Verschlusstabellen" Struktur.

TML
quelle
9

Ein rekursiver CTE ist die einfachste Lösung. SQL Server 2005 und aktuelle Versionen von PostgreSQL unterstützen CTEs. Wenn Sie SQL Server 2008 oder höher verwenden, können Sie den HIERARCHYIDDatentyp verwenden. Ein gutes Beispiel hierfür finden Sie unter HierarchyID: Modellieren Sie Ihre Datenhierarchien mit SQL Server 2008

Zusätzliche Ressourcen:

Jeremiah Peschka
quelle
1

Die Standard-SQL-Methode ist eine "rekursive Abfrage", die vom rekursiven CTE bereitgestellt und wie WITH [ RECURSIVE ]in der Abfrage angegeben wird. Die Implementierung wird in der Spezifikation nicht angegeben, sondern nur die Methoden, die für die Abfrage von rekursiven Strukturen zur Verfügung gestellt werden. Im einfachsten Fall erfordert die Implementierung der Datenstruktur nur eine ID und eine Eltern-ID in einer Zeile.

Es gibt auch viele RDBMS-spezifische Lösungen: PostgreSQL unterstützt beispielsweise rekursive CTEs, bietet jedoch auch ltreeeine Reihe von Vor- und Nachteilen bei der Implementierung.

Sie können weitere Informationen auf dieser Site finden, indem Sie das Tag durchsuchen .

Evan Carroll
quelle