Heim > Datenbank > MySQL-Tutorial > Wie können rekursive Selbstverknüpfungen hierarchische Daten in SQL Server effizient abrufen?

Wie können rekursive Selbstverknüpfungen hierarchische Daten in SQL Server effizient abrufen?

Linda Hamilton
Freigeben: 2025-01-17 15:47:14
Original
193 Leute haben es durchsucht

How Can Recursive Self-Joins Efficiently Retrieve Hierarchical Data in SQL Server?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage