___ qstnhdr ___ Rekursive Abfrage, die für die transitive Schließung verwendet wird
___ qstntxt ___
Ich habe ein einfaches Beispiel zur Veranschaulichung der transitiven Schließung mit rekursiven Abfragen in PostgreSQL erstellt.
Allerdings ist etwas mit meiner rekursiven Abfrage nicht möglich. Ich bin mit der Syntax noch nicht vertraut, daher kann diese Bitte ganz und gar nichts von mir sein, und dafür entschuldige ich mich im Voraus. Wenn Sie die Abfrage ausführen, sehen Sie, dass Knoten 1 sich in den Pfadergebnissen wiederholt. Kann mir bitte jemand helfen, herauszufinden, wie man das SQL optimiert?
%Vor%
___ tag123postgresql ___ PostgreSQL ist ein Open-Source-Objektrelationales Datenbankverwaltungssystem (ORDBMS), das für alle wichtigen Plattformen einschließlich Linux, UNIX, Windows und OS X verfügbar ist.
Bitte geben Sie Ihre genaue Version von Postgres an, wenn Sie Fragen stellen. Fragen zur Administration oder erweiterten Funktionen richten Sie am besten auf dba.stackexchange.com.
___ answer20981436 ___
Sie haben Konto 1 als eigenes Elternteil festgelegt. Wenn Sie das übergeordnete Element dieses Kontos auf %code% setzen, können Sie vermeiden, dieses Konto sowohl als Start- als auch als Endknoten zu verwenden (die Logik wird so eingerichtet, dass Sie einen Zyklus einfügen, aber diesen Zyklus nicht hinzufügen, was vernünftig erscheint ). Es sieht auch ein bisschen schöner aus, die letzte "Pfad" -Spalte in etwas wie %code% zu ändern, um zu vermeiden, dass am Ende die Null ist.
___ answer20983666 ___
Sie können an mehreren Stellen vereinfachen (angenommen %code% und %code% sind %code% ):
%Vor%
- Die Spalten %code% , %code% , %code% sind nur Rauschen in Ihrer Abfrage.
- Die Bedingung %code% muss die Rekursion einen Schritt früher beenden, bevor der doppelte Eintrag vom obersten Knoten im Ergebnis ist. Das war ein "Off-by-One" in Ihrem Original.
Der Rest ist Formatierung.
Wenn Sie wissen , dass der einzige mögliche Kreis in Ihrem Graphen eine Selbstreferenz ist, können wir das billiger haben:
%Vor%
SQL Fiddle.
Beachten Sie, dass es für Datentypen mit einem Modifizierer (wie %code% ) Probleme (mindestens bis pg v9.4) geben würde, weil die Array-Verkettung den Modifizierer verliert, aber der rCTE darauf besteht, dass die Typen genau übereinstimmen:
___ tag123transitivesclosingtable ___ Eine transitive Closure-Tabelle ist eine Methode zum Speichern von hierarchischen Informationen in einer flachen Datenbank. Es unterstützt referenzielle Integrität wie die Adjazenzliste, unterstützt aber auch das Abfragen von Hierarchien beliebiger Tiefe wie verschachtelte Mengen.
___ tag123commonableexpression ___ Ein allgemeiner Tabellenausdruck (CTE) ist eine temporäre Ergebnismenge, die innerhalb des Ausführungsbereichs einer einzelnen SELECT-, INSERT-, UPDATE-, DELETE- oder CREATE VIEW-Anweisung definiert ist.
___ tag123recursivequery ___ Die Fähigkeit, rekursive Abfragen in SQL auszuführen
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden.
___