1

Os explico, ya que sé que el título es confuso.

Básicamente tengo una base de datos en la que una tabla contiene un campo FK que es reflexivo(jefe), es decir, que está relacionado con el campo clave de esa misma tabla(idEmpleado):

introducir la descripción de la imagen aquí

Bien, pretendo hacer un SELECT para obtener los registros de dicha tabla, pero con la excepción de que no quiero obtener los registros del campo FK "jefe", ya que son de tipo INT al estar relacionados con el campo clave que también es tipo INT, sino que lo que quiero que se muestre en su lugar es el nombre y apellidos del empleado que es el jefe, para que quede así más claro quién es, obteniendo algo así:

En resumen, si el campo FK estuviese relacionado con otra tabla no habría problema haciendo un inner join mismamente, pero si intento hacer el inner join aquí no me funciona, ya que no conozco la manera de decirle a MySQL que me muestre el nombre y apellidos del empleado cuyo id coincide con el registro "jefe", es decir, el nombre y apellidos del jefe.

Andtartes
  • 11
  • 2
  • No se entiende. `SELECT emp.idEmpleado, emp.nombreEmpleado, emp.apellidos, jf.nombreEmpleado as nombre_jefe, jf.apellidos as apellidos_jefe from empleados emp join empleados jf on emp.jefe=jf.idEmpleado` – ffflabs May 08 '21 at 18:10
  • Yo expresaría esta relación en una nueva tabla `jefe_empleado`. Realmente, ante una mínima evolución (situación nueva o nuevo requerimiento), la columna `jefe` en la tabla empleado terminará siendo un elemento extraño e inútil. Por ejemplo: que un empleado pueda tener dos jefes, que un empleado pueda cambiar de jefe por un periodo determinado (vacaciones del jefe titular), etc. Son situaciones habituales que echan por tierra tu actual modelo de datos. – A. Cedano May 08 '21 at 20:02

1 Answers1

0

Lo que haces es justamente un join hacia la misma tabla.

Asigna un alias distinto a cada aparición de la tabla en la cláusula from, de manera que puedas indicar sin ambigüedad a los campos de qué tabla te refieres, por ejemplo:

select   subalterno.idEmpleado
       , subalterno.nombreEmpleado
       , subalterno.apellidos
       , subalterno.salario
       , jefe.nombreEmpleado nombreJefe
       , jefe.apellidos apellidosJefe
  from Empleado as subalterno
       left join Empleado as jefe on jefe.idEmpleado = subalterno.jefe

He realizado un left join, dado que hay personas que no tienen jefe (al menos una, en todos lados), para que estas personas aparezcan en el listado.

Estas relaciones de una tabla a si misma son generalmente conocidas como relaciones jerárquicas o relaciones recursivas.

jachguate
  • 25,659
  • 7
  • 35
  • 61