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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top