Verwenden rekursiver Selbstverknüpfungen in SQL Server zum Abrufen von Kategorien und ihren Vorfahren
In diesem Artikel wird gezeigt, wie Sie mithilfe eines rekursiven Selbst-Joins eine Kategorie und ihre Vorgängerkategorien aus einer hierarchischen Tabelle in SQL Server abrufen. Für diese Aufgabe verwenden wir einen Common Table Expression (CTE).
Szenario:
Stellen Sie sich eine Categories
-Tabelle mit den Spalten Id
, Name
und ParentId
vor, die eine hierarchische Kategoriestruktur darstellen. Das Ziel besteht darin, eine Abfrage zu schreiben, die eine bestimmte Kategorie (z. B. „Business-Laptops“) zusammen mit allen übergeordneten Kategorien in einer einzigen, durch Kommas getrennten Zeichenfolge zurückgibt.
Rekursive CTE-Lösung:
Die Lösung verwendet einen rekursiven CTE, um die hierarchische Struktur zu durchlaufen. Hier ist die Abfrage:
<code class="language-sql">WITH CategoryHierarchy AS ( SELECT id, name, CAST(name AS VARCHAR(MAX)) AS path, parent_id FROM Categories WHERE parent_id IS NULL -- Start with root categories UNION ALL SELECT c.id, c.name, CAST(ch.path + ',' + c.name AS VARCHAR(MAX)), c.parent_id FROM Categories c INNER JOIN CategoryHierarchy ch ON c.parent_id = ch.id )</code>
Dieser CTE CategoryHierarchy
verknüpft die Categories
-Tabelle rekursiv mit sich selbst. Die anfängliche SELECT
-Anweisung wählt Stammkategorien aus (solche mit parent_id
als NULL). Das UNION ALL
kombiniert dies mit nachfolgenden rekursiven Auswahlen und erstellt die Zeichenfolge path
durch Verketten von übergeordneten und untergeordneten Kategorienamen.
Abfrage zum Abrufen einer bestimmten Kategorie und Vorfahren:
So rufen Sie die Kategorie „Business-Laptops“ und ihre Vorgänger ab:
<code class="language-sql">SELECT id, name, path FROM CategoryHierarchy WHERE name = 'Business Laptops';</code>
Beispieltabelle und Daten:
Lassen Sie uns eine Beispieltabelle Categories
erstellen und einige Daten einfügen:
<code class="language-sql">CREATE TABLE Categories ( Id INT PRIMARY KEY, Name VARCHAR(100), ParentId INT REFERENCES Categories(Id) ); INSERT INTO Categories (Id, Name, ParentId) VALUES (1, 'Electronics', NULL), (2, 'Laptops', 1), (3, 'Desktops', 1), (4, 'Business Laptops', 2), (5, 'Gaming Laptops', 2);</code>
Erwartetes Ergebnis:
Für die Abfrage, die auf „Business-Laptops“ abzielt, wäre die erwartete Ausgabe:
<code>id name path 4 Business Laptops Electronics,Laptops,Business Laptops</code>
Dieser Ansatz ruft mithilfe eines rekursiven CTE effektiv eine Kategorie und ihre vollständige Abstammung ab und bietet so eine klare und effiziente Lösung für die Navigation hierarchischer Daten in SQL Server. Denken Sie daran, die VARCHAR(MAX)
-Länge anzupassen, wenn Ihre Kategorienamen diese Grenze überschreiten könnten.
Das obige ist der detaillierte Inhalt vonWie rufe ich eine Kategorie und ihre Vorfahren mit rekursivem Self-Join in SQL Server ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!