0Pricing
Coding Interview Prep · Lección

Miembros ancla y recursivos

Conozca la estructura en dos partes de un CTE recursivo y cómo funciona la terminación

Miembros ancla y recursivos es una lección gratuita de Coding Interview Prep en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Coding Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Coding Interview Prep incluye 4 lecciones en total.

Por qué aparecen las CTE recursivas

Cuando un entrevistador le entrega un organigrama, una lista de materiales o un árbol de categorías y le pide obtener todos los descendientes, está comprobando si recurre a una CTE recursiva. Los JOIN simples solo pueden recorrer un número fijo de niveles; la recursividad permite recorrer una profundidad arbitraria.

La frase reveladora en una pregunta suele ser "hasta cualquier profundidad" o "hasta llegar al final". Esa es la señal. En esta lección aprenderá la estructura de dos partes que comparten todas las CTE recursivas: el ancla y el miembro recursivo.

La estructura básica de dos partes

Una CTE recursiva siempre incluye la palabra clave WITH RECURSIVE (Postgres, SQLite, MySQL 8+; SQL Server omite RECURSIVE) y un cuerpo formado por dos consultas combinadas mediante UNION ALL:

  • Miembro ancla — las filas iniciales, que se ejecuta una vez.
  • Miembro recursivo — hace referencia al propio nombre de la CTE y se ejecuta repetidamente.

Memorice esta estructura; a los entrevistadores les encanta pedirle que la escriba desde cero.

WITH RECURSIVE cte AS (
    -- anchor member
    SELECT ...
    UNION ALL
    -- recursive member
    SELECT ... FROM cte JOIN ...
)
SELECT * FROM cte;

Qué hace el ancla

El miembro ancla es una consulta ordinaria que no hace referencia a la CTE. Produce las filas semilla — el punto de partida del nivel cero. En un organigrama suele ser el CEO (la fila cuyo responsable es NULL); en una serie numérica, es el primer número.

El ancla se ejecuta exactamente una vez. Su resultado se convierte en el primer lote de filas que recibe el paso recursivo.

-- Anchor: the top of the hierarchy
SELECT id, name, manager_id, 1 AS depth
FROM employees
WHERE manager_id IS NULL

Qué hace el miembro recursivo

El miembro recursivo hace referencia a la CTE por su nombre. En cada iteración, combina las filas producidas por la iteración anterior con la tabla base para encontrar el siguiente nivel.

No ve toda la CTE acumulada hasta ese momento — solo las filas añadidas en el paso inmediatamente anterior. Este es el modelo mental clave que los entrevistadores suelen comprobar.

-- Recursive: children of the rows found so far
SELECT e.id, e.name, e.manager_id, c.depth + 1
FROM employees e
JOIN cte c ON e.manager_id = c.id

Cómo unir las piezas

Combine el ancla y el miembro recursivo con UNION ALL y el motor iterará automáticamente. Cada pasada añade el siguiente nivel hasta que el miembro recursivo devuelve cero filas; en ese momento, la recursividad se detiene.

A continuación se muestra un recorrido completo y ejecutable de un organigrama que también realiza el seguimiento de depth.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e
    JOIN org o ON e.manager_id = o.id
)
SELECT id, name, depth FROM org ORDER BY depth, id;

Cómo termina la recursividad

La recursividad se detiene cuando el miembro recursivo no produce filas nuevas. No hace falta un contador de iteraciones explícito — el JOIN deja de producir resultados de forma natural al llegar a las hojas del árbol.

En el ejemplo del organigrama, cuando llega a empleados que no tienen subordinados directos, el JOIN de la siguiente iteración no encuentra hijos, devuelve un resultado vacío y el motor se detiene. Comprender este comportamiento auto终iz?hmm

UNION ALL frente a UNION

Los entrevistadores suelen preguntar por qué usamos UNION ALL en lugar de UNION. Hay dos motivos:

  • Rendimiento — UNION elimina los duplicados en cada iteración, lo que resulta costoso.
  • Corrección — en un árbol, normalmente no puede haber filas duplicadas, por lo que eliminar duplicados es trabajo innecesario.

Use UNION solo cuando la estructura sea un grafo y quiera deliberadamente agrupar los nodos repetidos — pero, para protegerse de los ciclos, es mejor usar controles explícitos (que se explican más adelante).

Seguimiento de la profundidad y la ruta

Dos columnas adicionales hacen que los resultados recursivos sean mucho más útiles y suelen solicitarse en las entrevistas:

  • depth — comience en 1 en el ancla y sume 1 en el miembro recursivo.
  • path — acumule la cadena de identificadores o nombres para poder ver la ruta desde la raíz hasta el nodo.

Construir path como una cadena también sirve como herramienta de detección de ciclos más adelante.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth,
           CAST(name AS VARCHAR(1000)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1,
           o.path || ' > ' || e.name
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, depth, path FROM org;

Los tipos de las columnas deben coincidir

Un detalle sutil que puede causar problemas: el ancla y el miembro recursivo deben devolver el mismo número de columnas con tipos compatibles. Si construye una cadena path, el valor inicial del ancla debe convertirse a un tipo con suficiente capacidad (por ejemplo, VARCHAR(1000)); de lo contrario, el motor podría truncar el valor o generar un error de incompatibilidad de tipos en iteraciones posteriores.

Este es exactamente el tipo de detalle que un entrevistador introduce para comprobar si realmente ha ejecutado una CTE recursiva, en lugar de limitarse a leer sobre ellas.

Ejemplo de una lista de materiales

La misma estructura resuelve una lista de materiales: dada una pieza, enumera todas sus subpiezas a cualquier profundidad. El ancla selecciona el ensamblaje principal; el miembro recursivo recorre las relaciones de parent_part a child_part.

Observe que la estructura es idéntica a la del organigrama — solo cambian los nombres de las columnas. Reconocer que una misma estructura sirve para muchos problemas es la verdadera habilidad que se busca en una entrevista.

WITH RECURSIVE bom AS (
    SELECT child_part, parent_part, 1 AS lvl
    FROM parts WHERE parent_part = 'ENGINE'
    UNION ALL
    SELECT p.child_part, p.parent_part, b.lvl + 1
    FROM parts p JOIN bom b ON p.parent_part = b.child_part
)
SELECT child_part, lvl FROM bom;

Notas sobre los dialectos

Resumen rápido entre dialectos que los entrevistadores suelen valorar:

  • PostgreSQL, SQLite, MySQL 8+: WITH RECURSIVE name AS (...).
  • SQL Server: simplemente WITH name AS (...) — la palabra clave RECURSIVE está implícita y aplica un valor predeterminado de MAXRECURSION de 100.
  • Oracle: admite tanto las CTE recursivas como la sintaxis antigua CONNECT BY.

Decir "SQL Server no utiliza la palabra RECURSIVE" demuestra una amplitud de conocimientos real.

Comprobación rápida

Compruebe que domina la estructura de dos partes.

Recapitulación

Ya domina la estructura básica de una CTE recursiva:

  • WITH RECURSIVE + ancla + UNION ALL + miembro recursivo.
  • El ancla inicia el nivel cero y se ejecuta una vez.
  • El miembro recursivo combina la iteración anterior con la tabla base y se ejecuta hasta que no devuelve filas.
  • Use UNION ALL, realice el seguimiento de depth y path, y mantenga compatibles los tipos de las columnas.

A continuación: aplicar esta estructura para recorrer un organigrama real hacia abajo y hacia arriba.

Preguntas frecuentes

¿La lección «Miembros ancla y recursivos» es gratis?

Sí — el texto completo de «Miembros ancla y recursivos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Coding Interview Prep, actualiza a CoddyKit PRO. El curso de Coding Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «Miembros ancla y recursivos»?

Conozca la estructura en dos partes de un CTE recursivo y cómo funciona la terminación Practicas Coding Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Coding Interview Prep?

No se requiere experiencia previa. Coding Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Miembros ancla y recursivos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Coding Interview Prep?

Sí. Cada lección de Coding Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Miembros ancla y recursivos
  2. Recorrer un organigrama
  3. Generar series de números y fechas
  4. Evitar la recursividad infinita
← Volver a Coding Interview Prep