关于自我加入的Sql问题

时间:2011-06-19 17:52:16

标签: mysql sql self-join

我对MySQL的SQL连接有疑问。

假设我有下表A和父子关系。如何给所有孩子(包括孩子的子孩子到叶子节点)给予父母身份?

Table A
child id     parent id 
1            1
2            1
3            1
4            2
5            3
8            9

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

child id     parent id 
1            1
2            1
3            1
4            2
5            3

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

2 个答案:

答案 0 :(得分: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 parent where parent = 1)进行子选择

答案 1 :(得分: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;