0

我对 MySQL 的 SQL 连接有疑问。

假设我有下表 A 和父子关系。如何在给定父 id 的情况下获取所有子节点(包括子节点的子节点直到叶节点)?

表 A
孩子 id 父母 id
1 1
2 1
3 1
4 2
5 3
8 9

从上表中,如果我们给定父级 (1),我必须查询给定父级 id(1),它给出了所有层次结构示例:

孩子 id 父母 id
1 1
2 1
3 1
4 2
5 3

限制之一是我无法更改数据模型,因为数据模型是 JBPM 数据库表(开源)我正在为子流程的 JBPM 图中的 ProcessInstancelog 表添加一些功能(对于每个扇出流程)。

4

2 回答 2

1

您似乎希望能够选择一个父级,然后获取其所有子级,而不管其在层次结构中的位置。

最有效的方法是使用反向关联表。其中每个孩子都将与其父母相关联,授予父母,依此类推,直到您到达树的根部。

这显然意味着您必须在写入方面做更多的工作来维护表,但这将使您免于查询表的复杂性。

例子

id       parent
1        0
2        1
3        1
4        2

反向表

child     parent    level
2         1         1
3         1         1
4         2         1
4         1         2

这样,您可以在查询中使用 (select child where parent = 1) 进行子选择

于 2011-06-19T18:09:12.110 回答
0

您可以像这样在 sql 中执行此操作。

CREATE TABLE [dbo].[Employee](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nchar](10) NULL,
[managerId] [int] NULL,

)  

  WITH UserCTE AS (
    SELECT id, name, managerId,0 AS steps
     FROM dbo.[Employee]
     WHERE id = 1 

 UNION ALL

  SELECT mgr.id, mgr.name, mgr.managerId, usr.steps +1 AS steps
  FROM UserCTE AS usr
   INNER JOIN dbo.[Employee] AS mgr
     ON usr.managerId = mgr.id
)
SELECT * FROM UserCTE  order by id; 
于 2018-01-25T13:36:35.413 回答