Effizientes Abrufen hierarchischer Daten mit rekursiven Selbstverknüpfungen in SQL Server
Die rekursiven Selbstverknüpfungen von SQL Server bieten eine effektive Methode zum Navigieren durch hierarchische Datenstrukturen innerhalb einer einzelnen Tabelle. Bei dieser Technik werden die Zeilen der Tabelle durchlaufen, um verwandte Daten basierend auf hierarchischen Beziehungen zu sammeln. Die folgende Abfrage zeigt einen optimierten Ansatz:
<code class="language-sql">WITH q AS ( SELECT * FROM mytable WHERE ParentID IS NULL UNION ALL SELECT m.* FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q;</code>
Diese Abfrage verwendet einen rekursiven gemeinsamen Tabellenausdruck (CTE) mit dem Namen „q“. Der CTE beginnt mit der Auswahl aller Zeilen, in denen ParentID
den Wert NULL
hat, was die Knoten der obersten Ebene in der Hierarchie darstellt. Anschließend wird das mytable
rekursiv mit dem CTE selbst verknüpft und untergeordnete Zeilen basierend auf den Spalten ParentID
und PersonID
hinzugefügt. Dieser iterative Prozess wird fortgesetzt, bis alle Nachkommen einbezogen sind.
Betrachten Sie dieses Beispiel mytable
:
PersonID | Initials | ParentID |
---|---|---|
1 | CJ | NULL |
2 | EB | 1 |
3 | MB | 1 |
4 | SW | 2 |
5 | YT | NULL |
6 | IS | 5 |
Das Abrufen der CJ-Hierarchie (wobei PersonID
= 1) ergibt:
PersonID | Initials | ParentID |
---|---|---|
1 | CJ | NULL |
2 | EB | 1 |
3 | MB | 1 |
4 | SW | 2 |
In ähnlicher Weise würde die Hierarchie von EB (PersonID
= 2) Folgendes zurückgeben:
PersonID | Initials | ParentID |
---|---|---|
2 | EB | 1 |
4 | SW | 2 |
Um die hierarchische Reihenfolge aufrechtzuerhalten, ist eine modifizierte Abfrage mit einer Bestellbedingung von Vorteil:
<code class="language-sql">WITH q AS ( SELECT m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc FROM mytable m WHERE ParentID IS NULL UNION ALL SELECT m.*, q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q ORDER BY bc;</code>
Diese erweiterte Abfrage führt eine bc
-Spalte in den CTE ein, die den Pfad von jedem Knoten zum Stamm darstellt. Durch die Sortierung der Ergebnisse nach bc
wird sichergestellt, dass die hierarchische Struktur, einschließlich der Geschwisterreihenfolge, erhalten bleibt. Die ORDER BY
-Klausel kann angepasst werden, um die Geschwisterreihenfolge nach Bedarf anzupassen.
Das obige ist der detaillierte Inhalt vonWie können rekursive Selbstverknüpfungen hierarchische Daten in SQL Server effizient abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!