Sql Frage: Werden Eltern Reihen von untergeordneten Zeilen gefolgt
-
05-07-2019 - |
Frage
id parent_id
1 0
2 0
3 2
4 0
5 1
6 0
Ich brauche eine Abfrage, die übergeordneten Zeilen zurückgeben wird (parent_id = 0), gefolgt von den untergeordneten Zeilen
erste Mutter
alle Kinder von erst Eltern
zweiter Elternteil
alle Kinder zweit Eltern
dritter Elternteil
vierte Elternteil
Erwartetes Ergebnis: ordered by id
id parent_id
1 0 (erste parent)
5 1 (alle Kinder von erst Eltern)
2 0 zweiter Elternteil
3 2 (alle Kinder des zweiten Elternteil)
4 0 dritter Elternteil
6 0 vierte Elternteil
kann ich Vereinigung der Eltern von allen Childs gefolgt verwenden Aber das gibt mir die Eltern zuerst die Kinder dann. Ich brauche Eltern und sofort seine Kinder.
Jeder kann helfen?
Lösung
Sie würden einen rekursiven CTE für diese verwenden:
WITH r AS
(SELECT id,
NULL AS parent_id,
CAST(right('000' + CAST(row_number()
OVER (table.id) AS varchar), 3) AS varchar(50))
FROM table WHERE parent IS NULL
UNION ALL
SELECT table.id, table.parent_id,
CAST(r.ord + right('000' + CAST(row_number()
OVER (ORDER BY table.id) AS varchar), 3) AS varchar(50))
FROM r JOIN table
ON table.parent = r.id)
SELECT id
FROM r
ORDER BY left(ord + '000000000000000000000000000000000', 36)
Beachten Sie, dass diese bestimmte Version brechen, wenn eine ID einen Wert von mehr als 999 hat, und es wird brechen, wenn Sie mehr als 12 Ebene haben. Wenn dies ein Problem für Sie ist, müssen Sie die Anzahl der Nullen in den verschiedenen Orten anzupassen.
Es könnte bessere Möglichkeiten, aber diese funktioniert.
Andere Tipps
Hier ist ein Beispiel Lösung, die eine Vereinigung mit einem durch Klausel (Es wird nicht für tiefe Verschachtelung arbeiten obwohl).
SELECT p.id,
p.parent_id,
p.name,
p.id AS sequence
FROM topics AS p
WHERE p.parent_id = 0
UNION
SELECT t.id,
t.parent_id,
t.name,
t.parent_id AS sequence
FROM topics AS t
WHERE t.parent_id <> 0
ORDER BY sequence, parent_id, name
Soweit ich weiß, Sie können dies nicht mit einer einzigen SQL-Anweisung, wenn alles, was Sie speichern die Eltern-ID ist. Wenn Sie den Baum von Daten schnell abrufen müssen, werden Sie haben zu prüfen, eine Pre-Order Traversal zu speichern. Es ist einfacher, als es klingt und es ist sehr gut hier beschrieben: http: //articles.sitepoint. com / article / hierarchisch-data-Datenbank