SELECT
es.empleado_nom jefe,
MAX(tg.tipo_gestion) tipo_gestion,
GROUP_CONCAT(ei.empleado_nom) subalternos
FROM tipo_gestion_20180801 tg
INNER JOIN gestion_20180801 g ON tg.tipo_gestion_id=g.tipo_gestion_id
INNER JOIN empleado_20180801 ei ON g.empleado_id=ei.empleado_id
INNER JOIN empleado_20180801 es ON g.superior_id=es.empleado_id
GROUP BY es.empleado_id
ORDER BY max(tg.orden);
一个假设的结果是:
jefe tipo_gestion subalternos
-----------------------------------------------------------------------------------------
Alberto López Director Pablo Contancio,Jeyson Vargas,Andrea Villamizar
Carolina Montes Coordinador Jorge Rincón,Laura Acevedo
我强调,假设结果表达的是:
Alberto López是其中Director之一Pablo Contancio,Jeyson Vargas,Andrea Villamizar
CREATE FUNCTION GetListOfBosses(@id Nvarchar(50)) RETURNS STRING
AS
BEGIN
DECLARE @id INTEGER
DECLARE @jefeid INTEGER
DELCARE @jefeslist STRING
set @jefeid = select id FROM employeeTbl where ID = @id
set @jefename = select nombre FROM employeeTbl where ID = @id
IF @jefeid != NULL
@jefeslist = @jefename + GetListOfBosses(@jefeid)
ELSE
@jefeslist = @jefename
END
RETURN @jefeslist
END
它会被称为这样的东西
SELECT id, name, GetListOfBosses(id) FROM employeeTbl;
SELECT CONCAT( T1.nombre,
IFNULL(CONCAT(',',T2.nombre),''),
IFNULL(CONCAT(',',T3.nombre),''),
IFNULL(CONCAT(',',T4.nombre),'')
)
from TablaEmpleados T1
LEFT JOIN TablaEmpleados T2
ON T2.ID = T1.idjefe AND T1.ID <> T1.idjefe
LEFT JOIN TablaEmpleados T3
ON T3.ID = T2.idjefe AND T2.ID <> T2.idjefe
LEFT JOIN TablaEmpleados T4
ON T4.ID = T3.idjefe AND T3.ID <> T3.idjefe
如果我正确理解了您想要的内容,我会重新安排我的数据库设计,其中包含几个表:
empleado
:管理所有员工及其职位cargo
: 处理收费gestion
: 管理 员工之间的关系。换句话说,谁是谁的老板,在什么意义上?tipo_gestion
:管理一名员工对另一名员工执行的命令类型以及该命令在组织结构图中的优先级。该表将允许根据从董事到公司最后一位的重要性排序。基于该架构,我们可以通过如下简单查询获得您想要的内容:
一个假设的结果是:
我强调,假设结果表达的是:
Alberto López
是其中Director
之一Pablo Contancio,Jeyson Vargas,Andrea Villamizar
Carolina Montes
Coordinadora
来自_Jorge Rincón,Laura Acevedo
我想说像你这样的设计可能很复杂。让我们想象一个场景,其中一名员工可以从属于公司不同领域的两个或多个老板。或者某个员工属于
sub-alterno
某个人,同时又是其他人的老板……对于所有这些复杂的情况,该表gestion
提供了灵活性,可以适应任何事情的清晰和轻松处理。我不知道答案是否正是你想要的,但至少我认为它为这类案例开辟了不同的视野。
我希望它对你有用。下面我给你留下了 我用来进行演示的假设数据的链接。您可以在 rextester 中修改它们并对该数据模型进行测试或在您方便时对其进行修改。
概念证明
VER DEMOSTRACIÓN EN REXTESTER
这取决于您使用的数据库引擎,如果支持的语言是大多数 Transact SQL,您可以创建一个递归标量函数来解析该查询并在 SELECT 中调用它,您没有指定您使用的语法,我没有对 TSQL 不太记得了,所以把这个片段当作伪代码。
它会被称为这样的东西
如果“级别”的数量是固定的并且它们不是太多,根据您的示例,不超过 4,您可以使用平面查询,
JOIN
在同一张表上进行递归:注意:条件
T(n).ID <> T(n).idjefe
是如果我们到达导演,就不会继续前进。