Rekursive Abfragen in SQLite3: Lösung komplexer hierarchischer Datenbeziehungen
SQLite3, eine weit verbreitete Datenbank-Engine, hatte traditionell keine Unterstützung für rekursive Abfragen. Dies stellt den Umgang mit hierarchischen Datenstrukturen vor Herausforderungen. Mit der Einführung von Common Table Expressions (CTEs) in SQLite 3.8.3 erhielten Benutzer jedoch die Möglichkeit, rekursive Abfragen auszuführen.
Beispiel für eine rekursive Abfrage
Bedenken Sie a Tabelle mit dem Namen „Part“ mit der folgenden Struktur:
Table: Part Part SuperPart wk0Z wk00 wk06 wk02 wk07 wk02 eZ01 eZ00 eZ02 eZ00 eZ03 eZ01 eZ04 eZ01
Um alle Paare eines bestimmten „SuperPart“ zu finden mit seinen Unterteilen ist eine rekursive Abfrage erforderlich. Für „SuperPart“ eZ00 sollte die Abfrage beispielsweise Paare wie (eZ00, eZ01), (eZ01, eZ03) und (eZ00, eZ03) zurückgeben.
Verwendung rekursiver CTEs
Seit SQLite 3.8.3 rekursiv Für solche Abfragen können CTEs eingesetzt werden. Die folgende Abfrage nutzt CTEs, um das gewünschte Ergebnis zu erzielen:
WITH RECURSIVE subParts AS ( SELECT Part, SuperPart FROM Part WHERE SuperPart = :superPart UNION ALL SELECT p.Part, p.SuperPart FROM Part AS p JOIN subParts AS sp ON p.SuperPart = sp.Part ) SELECT Part, SuperPart FROM subParts;
Diese Abfrage verwendet einen CTE namens „subParts“, um iterativ alle Unterteile eines bestimmten „SuperPart“ zu finden. Die rekursive „UNION ALL“-Klausel ermöglicht es dem CTE, sich selbst beizutreten, wodurch er die Hierarchie durchqueren und die erforderlichen Paare sammeln kann.
Verwendung der Client-Code-Rekursion
Für SQLite-Versionen vor 3.8.3, die keine CTE-Unterstützung haben, muss eine Clientcode-Rekursion verwendet werden. Dazu gehört das manuelle Abrufen von Zeilen und Unterteil-IDs, bis keine Daten mehr zurückgegeben werden. Der folgende Ausschnitt veranschaulicht diesen Ansatz:
# Recursive helper function def get_subparts(superPart): # Get initial row and sub-part IDs row = select_one("SELECT Part, SuperPart FROM Part WHERE SuperPart = ?", (superPart,)) if not row: return # Yield current sub-part yield row['Part'] # Recursively get sub-parts of sub-parts for subPart in get_subparts(row['Part']): yield subPart # Iterate over sub-parts using client-code recursion for subPart in get_subparts("eZ00"): print(subPart)
Das obige ist der detaillierte Inhalt vonWie können rekursive Abfragen in SQLite3 komplexe hierarchische Datenbeziehungen lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!