Pregunta

id parent_id

1 0

2 0

3 2

4 0

5 1

6 0

Necesito una consulta que devuelva las filas primarias (parent_id = 0) seguido de sus filas secundarias

primer padre

todos los hijos del primer padre

segundo padre

todos los hijos de segundo padre

tercer padre

cuarto padre

Resultado esperado: ordenado por ID

id parent_id

1 0 (primer padre)

5 1 (todos los hijos del primer padre)

2 0 segundo padre

3 2 (todos los hijos del segundo padre)

4 0 tercer padre

6 0 cuarto padre

Puedo usar la unión de padres seguida por todos los niños Pero eso me da los padres primero y luego los niños. Necesito padres e inmediatamente sus hijos.

¿Alguien puede ayudar?

¿Fue útil?

Solución

Usaría un CTE recursivo para esto:

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)

Tenga en cuenta que esta versión en particular se interrumpirá si cualquier ID tiene un valor superior a 999, y se romperá si tiene más de 12 niveles. Si esto le preocupa, debe ajustar el número de ceros en los distintos lugares.

Puede haber mejores formas, pero esta funciona.

Otros consejos

Aquí hay una solución de ejemplo que usa una unión con una cláusula orden por (aunque no funcionará para anidar en profundidad).

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

Por lo que sé, no puede hacer esto con una sola instrucción SQL si todo lo que está almacenando es el ID principal. Si necesita recuperar el árbol de datos rápidamente, deberá considerar el almacenamiento de un recorrido previo al pedido. Es más fácil de lo que parece y está muy bien descrito aquí: http: //articles.sitepoint. com / article / hierarchical-data-database

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top