当前位置: 首页 > 面试题库 >

尝试获取准确的信息(CTE-递归)

井修雅
2023-03-14
问题内容

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

> 客户| APPROVER1 | APPROVER2 | APPROVER3 | 审批人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被分配给数学安德鲁… 308是表示马特·安德鲁是客户的数字

13被分配给John Connor … 308是表示John Connor是CLIENT的数字

由于Math Andrew和John Connor是CLIENTS(也称为客户),因此必须将其链接到一个或多个APPROVERS

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

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

客户-审批人4(这是1-1的关系)PS:总是会以某种方式将客户与审批人4相关

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

客户-审批人1-审批人2-审批人4(在这种情况下,将有3个关系。一个:客户审批人1,审批人1-审批人2和审批人2-审批人4)

等等…(希望您能想到这个主意)

表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');

表type_relation

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

关系类型:

客户-审批人1:(459,“客户审批人1”)

客户-审批人2:(471,“客户审批2”)

客户-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’)

这很重要:当客户链接到一个批准人时,将在 关系表中 创建一个新关系。

表关系:

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

787是行创建时分配的编号
459表示该关系:客户- 批准者
链1-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 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。然后将这些值用于条件放大以创建表。



 类似资料:
  • 问题内容: 将信号量动作包装在try- catch块中的正确方法是什么?如果在获取一定数量(但不是全部)所请求的许可后中断获取动作,会发生什么情况?你怎么知道又要释放多少?应该将发布放到一个“最终”块中,但是如果操作被中断,您是否不可以发布未获得的许可? 问题答案: 该方法是一项全有或全无的操作,您将获得所有请求的许可或被阻止。您可以对代码进行两次尝试,也可以让(可能的)中断的异常阻止气泡进入调用

  • 本文向大家介绍js如何准确获取当前页面url网址信息,包括了js如何准确获取当前页面url网址信息的使用技巧和注意事项,需要的朋友参考一下 在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结。 下面我们举例一个URL,然后获得它的各个组成部分:http://i.jb51.net/EditPosts.aspx?opt=1 1、wind

  • 我想从JSON文件中检索所有键值。例如: 我想得到: 我有一个函数,它以可观察的方式返回我的JSON的内容: 之后,使用重新格式化数据,以仅获取具有函数的键: 我的问题是,我只得到了我所说的JSON级别(data.items[0])中的密钥,而没有得到升序或后代。 当然,我可以创建多个请求,但它要求提前知道JSON的结构,我想要的是使其通用。。。 无论JSON的结构如何,我如何才能拥有一个包含所有

  • 接口说明 获取License信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /wish3dearth/api/access/v1.0.0/getLicenseInfo 是否需要登录 否 请求字段说明 无 响应字段说明 参数 类型 说明 hardwareComputerID number 许可码 RegistrationDate

  • 接口说明 获取License信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /wish3dearth/api/access/v1.0.

  • 执行 gradle help —task someTask 可以显示指定任务的详细信息. 或者多项目构建中相同任务名称的所有任务的信息. 如下例. 例 11.12. 获取任务帮助 gradle -q help —task libs的输出结果 > gradle -q help --task libs Detailed task information for libs Paths :api