es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Buscar campo en la consulta recursiva de Postgresql

Necesito crear un árbol a partir de una tabla enlazada a sí misma, por ejemplo:

CREATE TABLE tree(
id serial primary key,
parent int4,
text_field varchar(255)
);

Los temas sobre CTE recursivas indican que la consulta recursiva deja de ejecutarse cuando no hay filas en la parte recursiva de la sentencia SELECT. Necesito algún tipo de búsqueda en profundidad, mi consulta funciona incorrectamente de la siguiente manera:

WITH RECURSIVE tree_query as(
SELECT T0.id, T0.parent, T0.text_field
FROM tree T0
WHERE T0.parent is null --buscar desde la raíz
UNION
SELECT TT0.id, TT0.parent, TT0.text_field
FROM tree TT0
INNER JOIN tree_query t ON t.id = TT0.parent
WHERE TT0.text_field LIKE '%smth%'
)
SELECT * FROM tree_query;

La razón principal por la que funciona incorrectamente es que se detiene la ejecución cuando busco algo en el nivel 3 o superior, porque no hay filas relevantes en la parte recursiva de la consulta y solo obtengo una raíz.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para realizar una búsqueda en profundidad utilizando un CTE recursivo en PostgreSQL, puedes modificar tu consulta para incluir una columna que lleve un seguimiento de la profundidad actual. Esto garantizará que la recursión continúe hasta que todas las filas relevantes se incluyan en el conjunto de resultados. Aquí tienes un ejemplo:

    CON RECURSIVE tree_query AS (
    SELECT T0.id, T0.parent, T0.text_field, 1 AS depth -- comenzar con profundidad 1
    FROM tree T0
    WHERE T0.parent IS NULL --buscar desde la raíz
    UNION ALL
    SELECT TT0.id, TT0.parent, TT0.text_field, t.depth + 1 -- incrementar la profundidad en 1
    FROM tree TT0
    INNER JOIN tree_query t ON t.id = TT0.parent
    WHERE TT0.text_field LIKE '%smth%'
    )
    SELECT * FROM tree_query;
    

    Ten en cuenta que reemplacé UNION con UNION ALL para permitir duplicados en el conjunto de resultados. También añadí una columna de profundidad que comienza en 1 en el nodo raíz y se incrementa en 1 para cada nodo hijo. Esto garantiza que la recursión continúe hasta que se incluyan todos los nodos relevantes en el conjunto de resultados.

Comments are closed.