【问题标题】:hierarchical records using sql使用 sql 的分层记录
【发布时间】:2020-04-30 18:00:59
【问题描述】:

我有一张这样的桌子

**id    exType               exId   depType              depId**    
  1     Ceo                  1      Board Of Director      1    
  2     Board Of Director    1      Manager                4    
  3     Board Of Director    1      Manager                5    
  4     Manager              4      TeamLead               1    
  5     Manager              5      TeamLead               2    
  6     TeamLead             1      Member                 7    
  7     TeamLead             1      Member                 8    
  8     TeamLead             1      Member                 9    
  9     TeamLead             1      Member                 10   
  10    TeamLead             2      Member                19

当我输入 exType 为 Manager 和 exId 为 4 时,我想要所有成员的输入

                                    Member                 7    
                                    Member                 8    
                                    Member                 9    
                                    Member                 10   

或者当我将输入作为 exType 作为 teamlead 并将 exId 作为 1 我想要时,我想要所有成员的输入

                                    Member                 7    
                                    Member                 8    
                                    Member                 9    
                                    Member                 10   

或者当我输入 exType 作为 CEO 和 exId 作为 1 我想要输入时,我想要所有成员的输入

                                    Member                 7    
                                    Member                 8    
                                    Member                 9    
                                    Member                 10   

【问题讨论】:

  • 。 .我删除了不一致的数据库标签。请标记您真正使用的数据库。

标签: sql postgresql select hierarchical-query


【解决方案1】:

您可以使用递归查询来展示给定节点的所有依赖项:

with recursive cte as (
    select depType, depId 
    from mytable 
    where exType = 'Manager' and exId = 4
    union all
    select t.depType, t.depId
    from cte c
    inner join mytable t on t.exId = c.depId and t.exType = c.depType
)
select * from cte

【讨论】:

  • @David:递归查询的语法因数据库而异(并且可能也取决于数据库版本)。你想在哪个数据库/版本中运行它?
  • 目前适用于 Oracle (11) 和 MySql(5.7) 数据库
  • @David:mysql 仅支持从 8.0 版开始的递归查询。在 oracle 中,需要进行小的更改。您不能真正拥有适用于所有数据库的递归查询语法。你标记了你的问题postgres,所以我为这个特定的数据库提供了一个解决方案。
  • 谢谢你,如果你能提供两个数据库(Mysql/Oracle)会很有帮助
猜你喜欢
  • 2010-09-20
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 2022-06-14
  • 1970-01-01
  • 2012-06-10
  • 2012-03-01
相关资源
最近更新 更多