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

2023-12-27

我有不同的桌子和goal是获取每个客户的批准工作流程,以这种方式显示该信息:

> 客户 |批准者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);

DO NOTE:

12 被分配给 Math Andrew...308 是这个数字 马特·安德鲁是客户

13 被分配给 John Connor...308 是这样的数字 约翰·康纳是客户

由于 Math Andrew 和 John Connor 是客户(也称为客户),因此他们必须链接到一个或多个批准者

一个客户端可以有 1 个 APPROVER、或 2 个 APPROVER、或 3 个 APPROVER、或 4 个 APPROVER,实体表中存在不同的批准者。

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

客户 - APPROVER4(这是 1-1 关系) PS:客户会 始终以某种方式与审批者保持联系4

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

客户端 - APPROVER1 - APPROVER2 - APPROVER4(在这种情况下将会有 3 种关系.. 一:客户-批准者1,批准者1-批准者2 和 批准者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');

关系类型:

客户 - 批准者 1 : (459,'客户-批准者 1')

客户-批准者2:(471,'客户-批准者2')

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

客户 - 批准者4:

(445,'J3 客户批准者4')

(446,'J4 客户批准者4')

(449,'J5 客户批准者4')

(444,'J6 客户批准者4')

(456,'J7 客户批准者4')

(457,'J8 客户批准者4')

(447,'J10 客户批准者4')

批准者 1 -批准者 2:

(460,'批准者1-批准者2')

批准者 2 - 批准者 3:

(463,'批准者2-批准者3')

批准者 3 - 批准者 4:

(464,'J3 批准者 3-批准者 4')

(465,'J4 批准者 3-批准者 4')

(466,'J5 批准者 3-批准者 4')

(467,'J6 批准者3-批准者4')

(468,'J7 批准者 3-批准者 4')

(469,'J8 批准者3-批准者4')

(470,'J10 批准者 3-批准者 4')


这很重要:当客户链接到一个审批者时,会出现一个新的审批者 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  |

最后 2 行只是一个示例


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

LINK_sample_SQL https://www.db-fiddle.com/f/x5SCaQ7WUgBCDTXUxZF85/0

但它显示信息而不显示列名称(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  |

我很迷茫,你能帮我吗?

EDIT:

批准人数上限为: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-FIDLE 演示 https://www.db-fiddle.com/f/x5SCaQ7WUgBCDTXUxZF85/0

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试获取准确的信息(CTE - 递归) 的相关文章

  • Laravel 4 - JOIN - 相同的列名

    我目前使用此代码从数据库中检索所需的数据 query DB table packages gt join assigned packages function join use id join gt on packages id assig
  • 使用输出在合并语句中设置变量

    我有一个合并语句应该始终更新或插入一条记录 我想记住变量中该语句的 ID 它看起来像这样 DECLARE int int MERGE dbo table AS A USING SELECT stringtomatch AS string A
  • NOLOCK 和 UNCOMMITTED 之间有什么区别

    我使用 SQL Server 2012 我写了两个查询 但是它们之间有什么不同NOLOCK and UnCommitted SELECT lastname firstname FROM HR Employees with READUNCOM
  • 在评论中查找不同风格的日期

    我还有一个问题要问preg match 我有一个表 其中评论的日期写在评论本身内 手动 现在我需要提取该日期并将其放置在不同的列中 我发现评论和日期的样式如下 id warning sent warning date 6109 2011 0
  • 在“GROUP BY”子句中重用选择表达式的结果?

    在 MySQL 中 我可以有这样的查询 select cast from unixtime t time Y m d H 00 as datetime as timeHour from some table t group by timeH
  • 使用实体框架创建临时表

    我想使用实体框架在 SQL Server 中创建临时表 我有什么办法可以做到这一点吗 如果我可以创建临时表 我的下一个问题是 如何读取它 提前致谢 Andr 好吧 所以你不喜欢存储过程路线 说实话我也不喜欢 但这是我能想到的最快的方法 基于
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • SQL查询中的Python列表作为参数[重复]

    这个问题在这里已经有答案了 我有一个 Python 列表 比如说 l 1 5 8 我想编写一个 SQL 查询来获取列表中所有元素的数据 例如 select name from students where id IN THE LIST l
  • phpMyAdmin - #1932 重新安装后表不存在(正在使用排序规则)

    我正在做我的论文 当我发现我的 XAMPP 服务器有一些错误日志时 所以我决定将我的 XAMPP 重新安装到更新的版本 我从 SO 中的一些线程中得 到了这个想法 我移动了我的mysql gt data文件夹并在我的新安装文件夹中再次恢复它
  • 关于mysql建表的几个问题

    CREATE TABLE favorite food person id SMALLINT UNSIGNED food VARCHAR 20 CONSTRAINT pk favorite food PRIMARY KEY person id
  • 如何从java中的字符串时间戳中提取日期和时间

    我正在获取日期和时间String TIMESTAMP来自服务器的 MySQL 格式如下 2014 02 15 05 18 08 我想要的是提取日期DD MM YYYY格式和时间HH MM SS AM PM格式 而且这个时间戳的时区是不同的
  • java.sql.SQLException:已经关闭

    我们有一个在 Tomcat 上运行的 Web 应用程序 带有 MySQL 后端 有一段时间一切都很好 然后突然我们开始遇到这个异常java sql SQLException Already closed 整个堆栈跟踪是 DEBUG org
  • 处理多种权限类型的最佳方法是什么?

    我经常遇到以下场景 我需要提供许多不同类型的权限 我主要使用 ASP NET VB NET 和 SQL Server 2000 Scenario 我想提供一个可以处理不同参数的动态权限系统 假设我想授予某个部门或特定人员访问应用程序的权限
  • SQL Server 'FETCH FIRST 1 ROWS ONLY' 无效使用

    我正在尝试将 Db2 查询转换为 SQL Server 我遇到了一个我不熟悉的构造 仅 FETCH FIRST 1 ROWS 这是在 db2 上运行的查询 select from products series where state xx
  • 需要在SQL Server 2012中自动递增字符串

    考虑 SQL Server 2012 中的表 789 0000000 上面的数字在 SQL Server 2012 中将被视为字符串 但每当我更新记录时 我都需要增加到 1 例如 当我更新记录 1 时 它应该增加到789 0000001 当
  • 当日期有时间时,访问查询将不起作用

    我有一个查询 select from tblClient where IntakeDate 5 31 2011 我确实知道有 8 条记录有该日期 但此查询没有提取任何具有该日期的记录 这 8 条记录有时间和 短日期 例如 5 31 2011
  • Rails 5.2.2(活动记录)WITH 语句

    我正在使用 Rails 5 2 2 并且有一个使用 WITH 语句的复杂查询 我需要使用左外连接创建该语句 我该如何做WITH活动记录中的语句 我的 TOTAL PROFILES 由查询对象驱动 并且会发生变化 而其余部分将始终保持不变 所
  • 当子查询具有组列时,MySQL 8 不使用 INDEX

    我们刚刚从 mariadb 5 5 迁移到 MySQL 8 一些更新查询突然变得很慢 经过更多调查 我们发现当子查询有组列时 MySQL 8不使用索引 例如 下面是一个示例数据库 桌子users维护每种类型用户的当前余额 表 帐户 维护每天
  • 如何优化这个查询(涉及4毫米表)

    我正在使用如下所示的遗留数据库架构 product table表有字段 uid 整数 主键 name varchar 50 category表有字段 uid 整数 主键 name varchar 50 好吧 现在product table与
  • 获取每月第二个星期二的日期

    有没有办法使用 T SQL 语法找出每月第二个星期二的日期 例如 三月是十二号 四月是九号 您可以通过此方法查找 2013 年所有 第二个星期二 select dateadd day 8 datediff day 1 dateadd mon

随机推荐

  • 本机库未在设备上运行

    我已将armeabi armeabi v7a 文件夹放入libs 文件夹中 而不是放入maven 存储库中 但我在使用 libgdx 时遇到以下错误 库 gdx backend jogl natives jar 包含不会在设备上运行的本机库
  • 获取特定 div 的 span 类内的文本

    我正在 T Mobile 网站上查找有关三星 Galaxy S9 的评论 我能够为 HTML 代码创建一个 Beautiful Soup 对象 但我无法获取 span 类中存在的评论文本 还需要遍历评论页面以收集所有评论 我尝试了 2 个代
  • jquery 调用 highcharts 生成错误 17

    我试图从 highcharts com 获取一个仪表 在我已经完成示例的页面上工作 但我看不出我做错了什么 如果有人能指出正确的方向 这是我的小提琴 高图仪表不工作 http jsfiddle net F6XUT 这是我的代码
  • Oracle:结合使用 ROWNUM 和 ORDER BY 子句更新表列

    我想用连续的整数填充表列 所以我考虑使用 ROWNUM 但是 我需要根据其他列的顺序填充它 例如ORDER BY column1 column2 不幸的是 这是不可能的 因为 Oracle 不接受以下声明 UPDATE table a SE
  • 使用高分辨率纹理优化 SceneKit 性能

    我是一位相当有经验的 iOS 开发人员 但完全是 SceneKit 新手 试图在基本应用程序中模拟一些行星 为此 我使用火星 金星等的高分辨率法线和漫反射贴图 应用于基本球体 他们工作了 它们看起来棒极了 正是我想要的 问题是 我得到了ki
  • Jquery 模式对话框禁用滚动条

    正如您在此链接中看到的 http jsbin com ozapol 9 http jsbin com ozapol 9 Jquery 在某些版本的 IE 和最新版本的 Chrome 上禁用滚动条 我还没尝试过其他的 有没有办法保持滚动条启用
  • 正则表达式中的命名捕获组

    我需要正则表达式的帮助来捕获以下字符串中的数字和连字符 一些文字和东西 200 1234EM 一些其他东西 它也可以不带连字符的部分出现 一些文本 123EM 其他文本 我需要在命名捕获组中使用 200 1234 或 123 我试过这个 b
  • 嵌入双引号的 CSV 解析

    我写了一个简单的 CSV 文件解析器 但看完之后有关 CSV 格式的 wiki 页面 http en wikipedia org wiki Comma separated values我注意到基本格式的一些 扩展 通过双引号专门嵌入逗号 我
  • 如何让 ActionController::Live Streaming 与 Thin 一起工作?

    Question 你能用吗thin with ActionController Live实现服务器端事件 SSE 和长轮询 如果是这样 怎么办 Context 虽然标题是重复的如何让 Rails 4 ActionController Liv
  • Python 2.6.6 中的小数和科学计数法问题

    我在处理十进制值时遇到困难 在某些情况下需要将其用于算术 而在其他情况下则需要将其用作字符串 具体来说 我有一份费率清单 例如 rates 0 1 0 000001 0 0000001 我使用它们来指定图像的压缩率 我最初需要将这些值作为数
  • 编辑数据时如何获取选定值 [codeigniter]

    当我编辑数据时 如何获取选定的值 但我仍然可以选择 codeigniter div class form group div
  • 当 DataFrame 列中的值以字符串开头时,使用 lambda 替换它们

    我有一个数据框 import pandas as pd import numpy as np x Value Test XXX123 XXX456 Test df pd DataFrame x 我想使用 lambda 将以 XXX 开头的值
  • mysqli::real_connect(): (HY000/2002): 连接被拒绝

    我使用 PHP Mysql 和 Codeigniter 版本 3 创建一个网站 然后将其托管在 iPage 上 当我实时上传时 我会更改配置文件 db default array dsn gt hostname gt 66 96 147 1
  • AndroidAnnotations如何在onCreate之后添加init代码

    如果我有一个活动定义为 EActivity R layout activity login public class LoginActivity extends Activity 这将为我创建 onCreate 方法 但我想在 onCrea
  • 从字符串中按 ID 提取元素?

    我有一个包含以下文本的字符串 p Apples and oranges p div ul li 196 pfel li li Birnen li ul div p Men and women p 现在我需要一个 JavaScript 函数来
  • 使用streamreader逐个字符读取并输出文本文件

    我想做的是读取文件 a txt 并在一行中输出每个字符我真的很难解决这个问题 任何帮助将不胜感激 如果您编写代码 请发表评论 以便我可以理解更清楚 因为我是初学者 谢谢 namespace ConsoleApplication13 clas
  • 获取模块的所有功能

    一个项目具有以下结构 modulename init py one function 1 py function2 py init py two another function py yet another function py ini
  • 使用垂直分割打开新的 Emacs 缓冲区

    如何在 Emacs 中将垂直分割设置为默认而不是水平分割 My use case I want to compare a Python file with an older revision of itself from the svn r
  • 在 docker buildkit 中使用秘密标志的正确方法

    我正在努力解决加文提到的同样问题这个问题 https stackoverflow com questions 56865849 setting docker env var from build secret 特别是在新docker构建秘密
  • 尝试获取准确的信息(CTE - 递归)

    我有不同的桌子和goal是获取每个客户的批准工作流程 以这种方式显示该信息 gt 客户 批准者1 批准者2 批准者3 批准者4 首先 我有一个名为实体的表 12 Math Andrew 308 CHAIN1 MathAndrew 13 Jo