0Pricing
SQL Interview Prep · Lección

SELF JOIN para jerarquías

Una una tabla consigo misma para modelar relaciones empleado-director y padre-hijo

SELF JOIN para jerarquías es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 2 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 SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.

Qué es realmente un SELF JOIN

Un self join es simplemente un join en el que una tabla aparece en ambos lados. No existe ninguna palabra clave especial SELF JOIN; se escribe un INNER o LEFT JOIN normal y se hace referencia dos veces a la misma tabla.

El mecanismo que lo hace posible son los alias de tabla. Se asigna un alias diferente a cada copia para que el motor las trate como dos tablas independientes.

SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Por qué los alias son obligatorios

Sin alias distintos, la consulta es ambigua: cada nombre de columna aparece dos veces y el motor no puede saber a qué copia se refiere. Asignar un alias a cada instancia resuelve el problema.

Interprete la combinación como 'asocie cada fila de empleado con la fila de empleado que es su responsable'. El alias e representa al empleado, m al responsable y ambos proceden de la misma tabla física.

-- e = the employee, m = that employee's manager
SELECT e.id, e.name, m.name AS reports_to
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;

Modelo de empleados y responsables

El escenario clásico de un self join es una lista de adyacencia: una sola tabla almacena las filas y cada fila apunta a su elemento padre mediante una clave foránea que referencia la misma tabla.

Una tabla employees con un manager_id que referencia a employees.id modela todo un organigrama en una sola tabla. Cada responsable es simplemente otra fila de empleado.

-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.id

Mostrar a todos con su responsable

La pregunta más frecuente sobre self joins: mostrar cada empleado junto al nombre de su responsable. Combine la copia de empleados con la copia de responsables mediante e.manager_id = m.id.

Esto devuelve una fila por cada empleado cuyo responsable existe. Observe que la parte más alta del organigrama, el CEO, tiene un manager_id NULL y quedará excluida por un inner join.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Usar LEFT JOIN para conservar la raíz del árbol

Para incluir al CEO, cuyo manager_id es NULL, cambie a un LEFT JOIN. Se conserva el lado de los empleados; las columnas del responsable aparecen como NULL en las filas que no tienen un elemento padre.

Los entrevistadores utilizan este caso para comprobar si recuerda que un self join interno elimina los nodos raíz. La solución es la misma que en cualquier situación de outer join en la que se deben conservar las filas sin coincidencia.

SELECT e.name AS employee,
       COALESCE(m.name, '(top level)') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;

Contar los subordinados directos de cada responsable

Una pregunta habitual de seguimiento: ¿cuántas personas dependen directamente de cada responsable? Haga un self join y, después, agrupe por el responsable.

Combinamos los empleados con los responsables, agrupamos por la identidad del responsable y contamos a los empleados. Esto cuenta solo los subordinados directos, no todo el subárbol que depende de ellos.

SELECT m.name AS manager, COUNT(*) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;

Bajar dos niveles

Para obtener un empleado, su responsable y el responsable de este, encadene tres copias de la tabla. Cada nivel requiere otro self join.

Esto funciona para una profundidad fija y conocida. Si necesita una profundidad arbitraria, un self join no es suficiente; esa es la señal para utilizar una CTE recursiva, que los entrevistadores esperan que mencione.

SELECT e.name AS employee,
       m.name AS manager,
       g.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees g ON m.manager_id = g.id;

Self join frente a CTE recursiva

Distinción clave que se comprueba en las entrevistas:

  • Un self join gestiona un número fijo de niveles. Tres copias equivalen a tres niveles, no más.
  • Una CTE recursiva gestiona una profundidad ilimitada al volver a combinar la tabla consigo misma hasta que no aparecen filas nuevas.

Por tanto, 'mostrar cada empleado y su responsable directo' requiere un self join, pero 'mostrar todos sus antepasados en la cadena' requiere recursividad.

Categorías padre-hijo

El mismo patrón permite modelar cualquier árbol: categorías de productos, hilos de comentarios o regiones geográficas. Una tabla categories con un parent_id que referencia a su propio id tiene la misma estructura que el caso de empleados y responsables.

Reconocer que 'una tabla con una clave foránea que se autorreferencia' equivale a 'self join o recursividad' es la idea reutilizable.

SELECT c.name AS category,
       p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;

Errores habituales en self joins

Preste atención a estos errores en las entrevistas:

  • Olvidar los alias, lo que provoca errores por columnas ambiguas.
  • Usar INNER JOIN y eliminar silenciosamente las filas raíz, cuyo padre es NULL.
  • Combinar en la dirección equivocada: e.id = m.manager_id en lugar de e.manager_id = m.id.

Antes de escribir ON, diga siempre en voz alta qué alias corresponde al hijo y cuál al padre.

Cuándo utilizar un self join

Utilice un self join siempre que una tabla relacione sus filas con otras filas de la misma tabla:

  • Jerarquías con un nivel fijo de consulta (empleado y responsable).
  • Emparejar o comparar filas de una misma tabla, como veremos en la siguiente lección.

Si la relación es recursiva y no tiene un límite, mencione una CTE recursiva como herramienta más adecuada. Este matiz distingue a los perfiles júnior de los de nivel intermedio.

Comprobación rápida

Compruebe su comprensión de los self joins aplicados a jerarquías.

Recapitulación: SELF JOIN para jerarquías

Ideas clave:

  • Un self join es un join normal con la misma tabla a ambos lados, diferenciados mediante alias.
  • Una lista de adyacencia, con una clave foránea autorreferenciada como manager_id, modela un árbol en una sola tabla.
  • Utilice INNER JOIN para los pares con coincidencia y LEFT JOIN para conservar las filas raíz con padres NULL.
  • Los self joins gestionan una profundidad fija; para recorrer una profundidad ilimitada se necesita una CTE recursiva.

Preguntas frecuentes

¿La lección «SELF JOIN para jerarquías» es gratis?

Sí — el texto completo de «SELF JOIN para jerarquías» 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 SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.

¿Qué aprenderé en «SELF JOIN para jerarquías»?

Una una tabla consigo misma para modelar relaciones empleado-director y padre-hijo Practicas SQL 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 SQL Interview Prep?

No se requiere experiencia previa. SQL 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 2 de 4.

¿Cuánto tiempo toma la lección «SELF JOIN para jerarquías»?

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 SQL Interview Prep?

Sí. Cada lección de SQL 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. CROSS JOIN y productos cartesianos
  2. SELF JOIN para jerarquías
  3. Comparar filas dentro de una tabla
  4. Elegir el tipo de join adecuado
← Volver a SQL Interview Prep