Heim >Datenbank >MySQL-Tutorial >Wie rufe ich eine Kategorie und ihre Vorfahren mit rekursivem Self-Join in SQL Server ab?

Wie rufe ich eine Kategorie und ihre Vorfahren mit rekursivem Self-Join in SQL Server ab?

DDD
DDDOriginal
2025-01-15 11:44:44401Durchsuche

How to Retrieve a Category and Its Ancestors Using Recursive Self-Join in SQL Server?

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!

Stellungnahme:
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