Wie kann ich eine Verschlusstabelle mit Daten aus einer Adjazenzliste erstellen?

8

Ich habe eine Datenbank, die eine Hierarchie von Kategorien enthält, die unter Verwendung des Adjazenzlistenmodells gespeichert sind.

Die Hierarchie ist 3 Ebenen tief (ohne einen imaginären Wurzelknoten) und enthält ungefähr 1700 Knoten. Knoten in der 2. und 3. Ebene können mehrere Eltern haben. Eine zusätzliche Tabelle wird für die Viele-zu-Viele-Beziehung wie folgt verwendet:

%Vor%

Wenn ich zur Verwendung der transitiven Closure-Tabellen-Methode (aus Gründen der Datenintegrität usw.) übergehe, gibt es eine relativ einfache Abfrage, die ich ausführen kann und die Werte für die Closure-Tabelle erzeugen würde? (mit SQL Server 2005)

Ich habe Artikel und Präsentationen wie Bill Karwins Modelle für hierarchische Daten durchgesehen Das hat nur Insertionsabfragen für einen einzelnen Knoten und es würde ewig dauern, bis ich meinen Baum so erstellen würde.

Danke.

BEARBEITEN:
RelID in der CategoryHierarchy-Tabelle ist rein aus Gründen eines Primärschlüssels, es hat keinen Einfluss auf die Knoten-IDs der Kategorie-Tabelle.

Auch mit der Verschlusstabelle meine ich eine Tabelle wie diese:

%Vor%

Dabei sind die ersten beiden Spalten ein zusammengesetzter Primärschlüssel und einzeln Fremdschlüssel für Category.id.

    
Adnan 27.09.2012, 12:54
quelle

3 Antworten

3

Ich denke, ich konnte die Lösung selbst erarbeiten.

Wenn jemand eine bessere Möglichkeit hat, dies zu tun, bitte Kommentar.

%Vor%

Prost:)

    
Adnan 27.09.2012, 16:38
quelle
8

Ich habe versucht, dasselbe herauszufinden, aber ich wollte es in einem rekursiven CTE. Dies hätte nicht für Sie funktioniert (SQL Server 2008+), aber hier ist, was ich für jemand anderen auf der Suche endete.

Art von schwer zu erklären, wie es funktioniert, aber der Schlüssel ist, dass die Anker nicht Ihre Wurzelknoten sind (wo parent_id IS NULL ), sondern stattdessen alle Ihre Null-Tiefe Reihen zu werden in der Verschlusstabelle.

Tabelle

%Vor%

Daten

%Vor%

CTE

%Vor%

Ergebnis

%Vor%     
Alex Guerra 15.04.2015 00:26
quelle
2
%Vor%

Nicht getestet, sollte aber so funktionieren. Zumindest ein Anfang, wie Sie das schnell ohne Schleifen machen.

EDIT: Ich vermisste, nicht relId, es ist parentId, die mit Childrens Tabelle verknüpfen muss. Aber das Ergebnis sollte eine Tabelle mit allen Tabellen sein. Das ist also nicht das, was du ursprünglich haben wolltest?

    
YvesR 27.09.2012 13:12
quelle