递归-链接SQL中的数据-卡住

问题描述 投票:0回答:1

我有不同的表,目标是为每个客户获得批准工作流程

客户具有不同的批准工作流程,请查看此:

在我的表中的“实体”中,我有这个

(((12,'Math Andrew',308,'CHAIN1-MathAndrew')。

这意味着在创建行时,将数字12分配给了数学安德鲁... 308是表示马特·安德鲁是客户的数字

Table type_entities 
(308,'CLIENT'),
(309,'APPROVER1'),
(310,'APPROVER2'),
(311,'APPROVER3'),
(312,'J3 APPROVER4'),
(313,'J4 APPROVER4'),
(314,'J5 APPROVER4'),
(315, 'J6 APPROVER4'),
(316,'J7 APPROVER4');

因为数学安德鲁是客户(也称为客户),所以他必须链接到一个或多个批准者

一个客户可能有1个批准者,或2个批准者,或3个批准者或4个批准者,实体表中存在不同的批准者:

(18, 'ZATCH', 309, null),
(19, 'MAX', 309, null),
(20, 'Ger',310, null),
(21, 'Mar',310, null),
(22, 'Maxwell',311, null),
(23, 'Ryan',312, null),
(24, 'Juy',313, null),
(25, 'Angel',314, null),
(26, 'John',315, null);

实体之间的关系类型:

(444,'J6 CLIENT-APPROVER4'),
(445,'J3 CLIENT-APPROVER4'),
(446,'J4 CLIENT-APPROVER4'),
(447,'J10 CLIENT-APPROVER4'),
(448,'J4 CLIENT-APPROVER4'),
(449,'J5 CLIENT-APPROVER4'),
(450,'J10 CLIENT-APPROVER4'),
(451,'J3 CLIENT-APPROVER4'),
(452,'J8 CLIENT-APPROVER4'),
(453,'J5 CLIENT-APPROVER4'),
(454,'J6 CLIENT-APPROVER4'),
(455,'J7 CLIENT-APPROVER4'),
(456,'J7 CLIENT-APPROVER4'),
(457,'J8 CLIENT-APPROVER4'),
(458,'CLIENT-APPROVER3'),
(459,'CLIENT-APPROVER1'),
(460,'APPROVER1-APPROVER2'),
(461,'APPROVER1-APPROVER3'),
(462,'J3 APPROVER1-APPROVER4'),
(463,'APPROVER2-APPROVER3'),
(464,'J3 APPROVER3-APPROVER4'),
(465,'J4 APPROVER3-APPROVER4'),
(466,'J5 APPROVER3-APPROVER4'),
(467,'J6 APPROVER3-APPROVER4'),
(468,'J7 APPROVER3-APPROVER4'),
(469,'J8 APPROVER3-APPROVER4'),
(470,'J10 APPROVER3-APPROVER4'),
(471,'CLIENT-APPROVER2');

这是重要的部分:当客户端链接到一个批准者时,将在relationships表中创建一个关系。

在这种情况下,[[MathAndrew已链接到批准者编号18(批处理),此行在分配后创建:

(787,459,'CHAIN1-MathAndrew',18)--

787是行数分配时的数字459

代表关系客户-批准人

CHAIN1-MathAndre是

客户端18是批准者

此外,在这种情况下,APPROVER1已链接到APPROVER2

((788,460,18,20)

然后,将APPROVER2链接到APPROVER3

((789,463,20,21)

最后,APPROVER3已链接到APPROVER4

(790,467,21,26)

我想获得完整的批准工作流程链,我的意思是:

CHAIN1-MathAndrew-ZATCH-Ger-Mar-John

我这样做了,但是我没有得到想要的东西:

WITH relationships_CTE as select description_entity_1,description_entitiy_2 from relationships where description_entitiy_1 like 'CHAIN1-MathAndrew' UNION ALL select description_entity_1,description_entitiy_2 from relationships where relationships.description_entitiy_2 = relationships_CTE.description_entitiy_2 select * from relationships_CTE ma left join relationships_CTE na

这是我的SQL FIDDLE:

http://sqlfiddle.com/#!9/51bb39/4

您能帮我吗?

sql common-table-expression recursive-query chaining
1个回答
0
投票
现在,根据您的问题,您想从entities表中获取名称以与relationships表中的值相对应。因此,我们通过为CTE找到适当的entities.id值来开始CHAIN1-MathAndrew,然后在CTE的递归部分中,我们遍历与该实体相关的所有实体,并随即获取名称。这给了我们这个查询:

WITH recursive relationships_CTE as ( select e.id, e.description AS name from entities e where e.description like 'CHAIN1-MathAndrew' UNION ALL select r.description_entitiy_2, e.name from relationships_CTE cte left join relationships r on r.description_entitiy_1 = cte.id join entities e ON r.description_entitiy_2 = e.id )

[如果现在开始

select *
from relationships_CTE

我们得到

id  name
12  CHAIN1-MathAndrew
18  ZATCH
20  Ger
21  Mar
26  John

或者我们可以使用GROUP_CONCAT将这些名称串在一起:

select group_concat(name separator '-')
from relationships_CTE

输出:

CHAIN1-MathAndrew-ZATCH-Ger-Mar-John

Demo on dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.