2011-06-19 39 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;