【问题标题】:Trying to obtain the accurate information (CTE - recursive)试图获得准确的信息(CTE - 递归)
【发布时间】:2019-11-18 04:23:34
【问题描述】:

我有不同的表格,目标是为每个客户获得批准工作流程,以这种方式显示该信息:

> 客户 |批准人1 |批准人2 |批准人3 |批准人4

首先,我有一个名为实体的表

(12, 'Math Andrew', 308, 'CHAIN1-MathAndrew')
(13, 'John Connor', 308, 'CHAIN2-JohnConnor')
(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);

请注意:

12 被分配给 Math Andrew... 308 是表示 Matt Andrew 是客户

13 被分配给 John Connor... 308 是表示 John Connor 是客户

因为 Math Andrew 和 John Connor 是客户(也称为 CUSTOMERS),所以他们必须与一个或多个 APPROVERS 相关联

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

当我说客户“可能”有 1 个或多个 APPROVERS 时,我的意思是这个

CLIENT - APPROOVER4(这是 1-1 关系) PS:A CLIENT WILL 始终以某种方式与批准者4相关

CLIENT - APPROVER1 - APPROVER4(在这种情况下将有 2 关系.. 一个:CLIENT-APPROVER1 和另一个 APPROVER1-APPROVER4)

CLIENT - APPROVER1 - APPROVER2 - APPROVER4(在这种情况下将有 3 个关系.. 一个:CLIENT-APPROVER1、APPROVER1-APPROVER2 和 批准人2 - 批准人4)

等等……(希望你明白)

表类型_实体

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

表类型关系

(444,'J6 CLIENT-APPROVER4'),
(445,'J3 CLIENT-APPROVER4'),
(446,'J4 CLIENT-APPROVER4'),
(447,'J10 CLIENT-APPROVER4'),
(449,'J5 CLIENT-APPROVER4'),
(453,'J5 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');

关系类型:

CLIENT - APPROVER1 : (459,'CLIENT-APPROVER1')

CLIENT - APPROVER2 : (471,'CLIENT-APPROVER2')

客户 - APPROVER3 : (461,'APPROVER1-APPROVER3')

客户 - 批准人4:

(445,'J3 CLIENT-APPROVER4')

(446,'J4 CLIENT-APPROVER4')

(449,'J5 CLIENT-APPROVER4')

(444,'J6 CLIENT-APPROVER4')

(456,'J7 CLIENT-APPROVER4')

(457,'J8 CLIENT-APPROVER4')

(447,'J10 CLIENT-APPROVER4')

审批者 1 -审批者 2:

(460,'APPROVER1-APPROVER2')

审批者 2 - 审批者 3:

(463,'APPROVER2-APPROVER3')

审批人 3 - 审批人 4:

(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')


这很重要:当客户链接到一个审批者时,一个新的 RELATION 在关系表中创建。

表关系:

(787,459,12,18)
(788,460,18,20)
(789,463,20,21)
(790,467,21,26)

787 是创建该行时分配的编号
459 代表关系:客户 - 批准人
CHAIN1-MathAndre 是客户
18 是批准人

遵循这个想法:

APPROVER1 已链接到 APPROVER2

(788,460,18,20)

APPROVER2 已链接到 APPROVER3

(789,463,20,21)

APPROVER3 已链接到 APPROVER4

(790,467,21,26) ​

所以,我想在屏幕上显示这个:

|CLIENT               | APPROVER1 | APPROVER2 | APPROVER3 | APPROVER4|
|CHAIN1-MathAndrew    |   ZATCH   |   Ger     |    Mar    |    John  |
|CHAIN2-JohnConnor    |    MAX    |           |    Mario  |    Steven|
|CHAIN3-MarioShapiro  |    IVAN   |           |           |    John  |

最后两行只是一个例子


这是我目前所拥有的(它正在工作):

LINK_sample_SQL

但它正在显示信息而不显示列名(CLIENT、APPROVER1、APPROVER2、APPROVER3、APPROVER4).. 这是显示这个:

CHAIN1-MathAndrew-ZATCH-Ger-Mar-John

我想这样显示数据:

|CLIENT               | APPROVER1 | APPROVER2 | APPROVER3 | APPROVER4|
|CHAIN1-MathAndrew    |   ZATCH   |   Ger     |    Mar    |    John  |
|CHAIN2-JohnConnor    |    MAX    |           |    Mario  |    Steven|
|CHAIN3-MarioShapiro  |    IVAN   |           |           |    John  |

我很迷茫,你能帮帮我吗?

编辑:

批准人的最大数量为:4

【问题讨论】:

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


    【解决方案1】:

    您应该根据需要使用条件聚合来格式化数据。尝试以下解决方案,我假设您拥有 MySQL ver.8 并且窗口函数可用:

    WITH recursive relationships_CTE as (
      select e.id, e.description AS name, 1 col_id, 
        row_number() over (order by e.id) row_id
      from entities e
      where e.description like 'CHAIN%'
        UNION ALL
      select r.description_entitiy_2, e.name, col_id+ 1, row_id
      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 
      max(case when col_id = 1 then name end) client,
      max(case when col_id = 2 then name end) approver1,
      max(case when col_id = 3 then name end) approver2,
      max(case when col_id = 4 then name end) approver3,
      max(case when col_id = 5 then name end) approver4
    from relationships_CTE
    group by row_id
    

    DB-FIDDLE DEMO

    该解决方案使用您的 SQL 查询并添加表格格式所需的信息:(1) row_id 和 (2) col_id。然后将这些值用于条件聚合以创建表。

    【讨论】:

    猜你喜欢
    • 2015-09-10
    • 2020-06-17
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多