CTE bekommen alle Kinder (Nachkommen) von einem Elternteil

Habe ich das problem, dass mir Kopfschmerzen...

Sagen, ich habe eine Tabelle mit einigen tausend Zeilen und die Struktur der Tabelle besteht aus einem Eltern -> Kind-Beziehung.

Beziehungen können bis zu 6 Ebenen. Hier ist ein Beispiel der Tabellenstruktur:

ProductId | ParentId | Levels
1174           0        1174
311           1174      311, 1174
1186          311       1186, 311, 1174
448           1186      448, 1186, 311, 1174
3365          448       3365, 448, 1186, 311, 1174

Wir haben einen Prozess durchläuft, wird die gesamte Tabelle, um die Beziehungen und speichert die "Ebenen" - Spalte, dieser Prozess ist sehr langsam ( wegen dem Schleifen ) und ich habe versucht, mit einigen cte, um die Beziehungen scheiterte aber miserabily.

Bisher habe ich versucht, dieses cte, aber es nicht tun, was ich mir erhofft hatte und es scheint auch zu replizierenden Zeilen...

;With Parents(ProductId, ParentId, Levels)
As(
  Select ProductId, ParentId, Levels
  From Products
  Where ParentId = 0 
  Union All
  Select p.ProductId, p.ParentId, p.Levels
  From Products p
  Join Parents cte On cte.ProductId = p.ParentId
)
Select *
From Parents

Als ich erwähnte früh, wir haben einen Prozess, die Schleifen auf den Tisch, es macht seinen job, aber es kann bis zu 30 Minuten dauern, meine Frage ist gibt es einen besseren Weg, dies zu tun? ich weiß, dass CTE erlaubt mir, es zu tun, aber ich es zu saugen, auch die Level-Spalte berechnet werden soll, und aktualisiert die Tabelle, ist es möglich?

Hier ein Sqlfiddle im Fall jemand helfen könnte, danke!

  • Wissen Sie, dass die WAK-s können rekursiv sein? Siehe hier: blog.sqlauthority.com/2008/07/28/...
  • Tipp: Ein gemeinsames design bedeutet, dass ParentId null-Werte zulässt und mit NULL zu stellen, eine Zeile ohne Eltern. Es vermeidet die Verwendung von eine Magische Zahl, um anzuzeigen, top-level-Zeilen oder die Verwirrung der eine top-level-Zeile seine eigenen Eltern, d.h. ProductId 1174 mit ParentId 1174.
  • in meinem cte Beispiel, ich bin rekursiv aufrufen. Bin ich es nicht?
  • ich weiß, es ist nicht das schönste design, aber es ist ein legacy-system nur selten verwendet, ich habe die Gewinner-ticket zu geben, einige Wartungsarbeiten an und ich bin versucht, zu aktualisieren alle DB Sachen in Gespeicherten Prozeduren, dieser Prozess, den ich mich beziehe ist es eine asp-Datei mit Tonnen und Tonnen wählt, update -, delete-und insert-Anweisungen. Danke für die Hilfe 😀
  • So sind Sie. Aus irgendeinem Grund lese ich es anders denke ich. Langen Tag.
InformationsquelleAutor Sam Ccp | 2013-11-11
Schreibe einen Kommentar