Pregunta Sql: Obtención de filas primarias seguidas de filas secundarias
-
05-07-2019 - |
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?
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