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 mitParentId
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies sollte es tun:
Und hier ist die aktualisierte SQL Fiddle.
Schauen Sie sich auch dieser link für die Hilfe mit CTEs... Sie sind auf jeden Fall gut zu wissen:
Hoffe, dass dies funktioniert der trick!
Levels
in Ihre CTE und wurden dann einfach Abfragen aus.... Es hat die Vorstellung von dem, was Sie versuchen zu erreichen. Wenn man sich meine SQLFiddle, die ursprüngliche Tabelle, die haben nicht mal eineLevels
Spalte - Wir schaffen es basiert auf der Produkt - / parent-Spalten als nötig wäre...;
vorWITH
with
muss nur das erste Schlüsselwort in der Anweisung. Wenn Sie richtig waren, die Kündigung Ihres bisherigen Aussagen mit semi Doppelpunkte würden Sie nicht brauchen, um voran zu euerwith
.