开发者社区> 问答> 正文

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

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

客户具有不同的批准工作流程,请查看以下内容:

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

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

这意味着在创建该行时,将数字12分配给了数学安德鲁... 308是表明Matt Andrew是客户的数字

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'); 由于Math Andrew是客户(也称为客户),因此必须将其链接到一个或多个批准者

客户可能有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'); 这是重要的部分:当客户链接到一个批准者时,将在关系表中创建一个关系。

在这种情况下,MathAndrew与批准人#18(ZATCH)相关联,此行在分配后创建:

(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

请你帮助我好吗?

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 09:54:35 560 0
1 条回答
写回答
取消 提交回答
  • 因此,您的演示存在两个主要问题,首先,您正在尝试在不支持它的MySQL版本上使用CTE(MySQL版本8中引入了CTE支持),其次,您尝试插入在relationships表中的列中添加了一个字符串(应该保留该entities表作为对表的引用。更正了这些问题之后,我们可以查看CTE。此处存在语法错误,因为您没有将CTE查询包含在中(),并且同样,您也未能将CTE声明为递归的(因为它指向自身)。

    现在,根据您的问题,您希望从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

    2019-11-18 09:54:50
    赞同 展开评论 打赏
问答分类:
SQL
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载