2011-06-19 129 views
0

我有关于MySQL的SQL连接的问题。关于自我加入的sql问题

假设我有以下表A和亲子关系船。如何让所有的孩子(包括子女的孩子,直到叶节点)给父母的ID?

 
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表添加了一些功能。

+1

据我所知,如果不使用游标/多个查询,这是不可能的。 –

+0

这可能是我,但我不明白你想要什么? “让所有的孩子给父母身份证”,这将意味着一个简单的'WHERE parent_id = x'。你的第二张表看起来是一样的,尽管错过了最后一行。我错过了什么吗?你究竟想要什么? – Nanne

+0

你想要所有的孩子递归吗? – Magnus

回答

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 

有了,你可以做一个子查询中查询与(选择子女,父母= 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;