【问题标题】:Recursion - chaining data in sql - stuck递归 - 在 sql 中链接数据 - 卡住
【发布时间】:2019-11-18 00:37:15
【问题描述】:

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

客户有不同的审批流程,看看这个:

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

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

这意味着在创建行时,数字 12 被分配给 Math Andrew...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');

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

在这种情况下,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

你能帮帮我吗?

【问题讨论】:

    标签: sql common-table-expression recursive-query chaining


    【解决方案1】:

    所以你的演示有几个主要问题,首先你试图在不支持它的 MySQL 版本上使用 CTE(CTE 支持是在 MySQL 版本 8 中引入的),其次你是试图在relationships 表的列中插入一个字符串(它应该作为对entities 表的引用。纠正了这些问题后,我们可以查看 CTE。你有一个语法错误,因为你没有将您的 CTE 查询包含在 () 中,并且您也没有将 CTE 声明为递归的(因为它引用了自身)。

    现在,根据您的问题,您希望从 entities 表中获取名称以对应于 relationships 表中的值。因此,我们通过为CHAIN1-MathAndrew 找到适当的entities.id 值来启动CTE,然后在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

    【讨论】:

    • 非常感谢您的回复,尼克..我正在检查这个! :)
    • 我有一个问题。我想获得单行但显示列:CLIENT|APPROVER1|APPROVER2|APPROVER3|APPROVER4。我该怎么做?
    • @Student_new 这又是一个更复杂的问题。这将取决于链中可以有多少批准者。如果这对你有用,我会接受,然后再问一个新问题,指的是这个问题。如果这不起作用,请告诉我,我们可以调试...
    • @Student_new 另一种选择是从第二个查询中获取连接的输出并将其拆分到您的应用程序中。这通常比尝试在 DBMS(例如 MySQL)中构建数据透视表更简单,但它本身并不支持它。
    • 是的,你是对的。我要创建一个新问题。请保持清醒!
    猜你喜欢
    • 2017-01-02
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多