Gibt es eine Möglichkeit, Baumdaten in SQL zu durchlaufen? Ich kenne connect by
Oracle, aber gibt es eine andere Möglichkeit, dies in anderen SQL-Implementierungen zu tun? Ich frage, weil die Verwendung connect by
einfacher 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_id
oder 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 by
in 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.
quelle
Antworten:
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.
quelle
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
HIERARCHYID
Datentyp verwenden. Ein gutes Beispiel hierfür finden Sie unter HierarchyID: Modellieren Sie Ihre Datenhierarchien mit SQL Server 2008Zusätzliche Ressourcen:
quelle
In SQL Server (2005 und neuere Editionen) können Sie zum Lesen von Hierarchien allgemeine Tabellenausdrücke verwenden. Einige Beispiele finden Sie unter Microsoft SQL Server 2005 - CTE-Beispiel einer einfachen Hierarchie .
Joe Celko hat mir ein Buch zum Thema "Bäume und Hierarchien in SQL für Smarties" empfohlen - obwohl ich mir das Buch selbst noch nicht angeschaut habe.
quelle
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
ltree
eine Reihe von Vor- und Nachteilen bei der Implementierung.Sie können weitere Informationen auf dieser Site finden, indem Sie das Hierarchie- Tag durchsuchen .
quelle